【问题标题】:Reuse childs from custom UIVIewController using storyboard使用情节提要重用来自自定义 UIVIewController 的孩子
【发布时间】:2013-07-18 11:02:39
【问题描述】:

我有一个带有导航控制器的故事板,它通向我想要重用的 UIVIewController。该 UIVIewController 有一个 ParentUIViewController,它具有我正在重用的所有 UIVIewControllers 的所有基本功能。

目前我正在复制和粘贴(meh),然后我将 UIViewController 的类更改为我想要使用的 ChildUIVIewController(ChildUIViewController 扩展 ParentUIViewController)。

但这听起来像是一个糟糕的解决方案。每次我想直观地更改 ParentViewController 时,我都需要手动更新所有其他 ChildViewController。

我已尝试为 ParentViewController 创建 xib,但未加载 xib because I need a xib with the name of the ChildViewController。我已经创建了它,然后说这个类是 ParentViewController 但它在 segue 中崩溃了。

编辑

我创建了一个问题状态示例

https://github.com/tiagoalmeida/storyboardexample

请注意,ParentViewController 有一组更复杂的逻辑方式,此处未说明。另请注意,我也在使用 TableView。我希望这可以说明问题。

【问题讨论】:

    标签: ios uiviewcontroller storyboard code-reuse


    【解决方案1】:

    保留 parentViewController 上的逻辑和子 UIViewControllers 上的 UI Part。如果您需要创建一个新的UIViewController,您将创建一个具有相应XIB 的子节点(或摆脱XIB 并手动创建接口)。

    【讨论】:

    • 我必须为每个孩子复制和粘贴视图?这与将它们放在情节提要中相同:/
    • 不,如果两个孩子共享相同的 UI,请将文件的所有者设置为您的 ParentViewController。如果两个孩子共享大部分相同的代码,则创建一个新的ParentViewController。所以你会得到类似的东西:childViewController : parentViewController : grandParentViewController。在这种情况下,grandParentViewController 将拥有每个 UIViewController 的共同点,而新的 parentViewController 将拥有两个孩子的逻辑。
    • 每个孩子共享相同的 UI。所以你建议我为每个孩子创建一个 xib 并将文件的所有者作为 ParentViewController(我将文件的所有者作为 ChildViewController)?我对你的 grandParentViewController 逻辑有点迷失了。
    • 那么,如果孩子们共享 UI,他们之间会发生什么变化?有点逻辑?如果逻辑是唯一改变 UI 的东西是相同的,则将 UI 保持在 parentViewController 上(以及孩子们共有的一切)。 grandParentViewController 的逻辑是不断向下钻取层次结构,以便您可以将通用代码保留在一个地方。
    • 它改变了一些逻辑(比如服务器的获取有点不同,视图中的标题等)。即使使用我拥有的方案(单独的 xibs),我仍然必须复制粘贴视图,因为如果 UIVIewController 中没有视图,它会崩溃。这个解决方案看起来很乱:/
    【解决方案2】:

    您是否考虑过通过“幻像按钮”循环回到同一个 UIViewController

    看看这个:UIStoryboard Power Drill, Batteries included

    基本上,您可以将Bar Button Item 拖到 Storyboard 中的 View Controller 下的小黑条中(带有 View Controller、First Responder 和 Exit 图标的 1;抱歉,我不记得这到底叫什么了),然后您可以控制并从该按钮拖回UIViewController 以进行Push segue。这应该在您的故事板中创建一个循环转场。接下来你需要做的就是给那个segue一个标识符,使用[self performSegueWithIdentifier:]从你的代码中以编程方式调用它,然后实现-(void)prepareForSegue:并使用[segue destinationViewController]有条件地设置标题,也许还有一些标志,这样你就可以确定何时使用同一类代码中的不同类型的提取(或其他代码变体)。

    【讨论】:

    • 这很有趣,感谢您的帖子。但是,我相信如果我将代码分隔在类层次结构中,则更容易理解代码。但是,这是一种可能的方法,如果找不到更好的解决方案,也许我会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2015-09-13
    • 2014-11-16
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多