在多个子类之间共享故事板视图控制器

Posted

技术标签:

【中文标题】在多个子类之间共享故事板视图控制器【英文标题】:Share a storyboard viewcontroller between multiple subclasses 【发布时间】:2012-11-16 04:12:32 【问题描述】:

我和 Pedro here 有同样的问题,但对答案不满意,因为已经有赏金和奖励,所以我创建了这个问题,我会尽快添加赏金。

我想在代码中创建或操作一个 segue(以黄色突出显示),以便主视图是 MFMasterViewController 的多个子类中的任何一个(以红色突出显示)。

使用 Nibs 执行此操作时,我可以创建一个 Nib,SharedNib.xib & set 类为MFMasterViewController,然后创建我的子类,比如说 MFMasterViewControllerSubclassA, MFMasterViewControllerSubclassB 等等,然后实例化我想要使用的任何子类...

MFMasterViewControllerSubclassA *controller = [[MFMasterViewControllerSubclassA alloc] initWithNibName:@"SharedNib" bundle:nil];

或者...

MFMasterViewControllerSubclassB *controller = [[MFMasterViewControllerSubclassB alloc] initWithNibName:@"SharedNib" bundle:nil];

等等

关于如何使用情节提要解决此问题的任何线索?

我无法对 Pedro 的问题使用提供的答案,我的子类化超出了数据源和委托。

【问题讨论】:

你做到了吗? 【参考方案1】:

您可以将未连接的视图控制器添加到情节提要中并为它们提供标识符。然后在代码中,您可以在导航控制器子类中执行以下操作:

MFMasterViewControllerSubclassA *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SubclassA"];
self.viewControllers = @[controller];

这会将导航控制器的根视图控制器更改为控制器。如果您想为更改设置动画,则可以使用 setViewControllers:animated: 而不是第二行。

【讨论】:

是的,但是每个 viewController 只能有一个标识符和一个子类。所以不可能用“instantiateViewControllerWithIdentifier”得到子类A和子类B @Tieme,您不想切换您希望控制器成为哪个类吗?每个子类都可以有自己的标识符,但是对于您尝试实例化的每个子类,您确实需要一个断开连接的视图控制器(如果您希望这一切都在 IB 中完成)。这是你想要避免的——每个子类都有一个场景吗? 我想避免 IB 中的多个场景,我想要 IB 中的一个场景,在那里我可以从所有连接的插座中派生多个子类!【参考方案2】:

我知道这是一个旧帖子,但我想我会回复,因为它还没有得到答复。这并不难做到。无论您希望在何处引用您的超类,只需通过适当的子类引用它即可。子类包含超类所做的一切。有很多方法可以做到这一点,具体取决于您希望如何进行转场。如果您使用的是 prepareForSegue,请这样做:

    通过按钮或其他方式创建转场。 为其分配一个ID 将您的子类导入到 .m 文件中

    在 prepareForSegue 中执行以下操作。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
       
          if ([segue.identifier isEqualToString:@"YourID"]) 
                SubclassA *subA = segue.destinationViewController; // the file's owner in the storyboard is set to the super class
                subA.someString = @"subclass A is setting this";
            
       
    

这是非常有限的,因为您正在共享故事板场景并且没有场景的子类。例如,您必须隐藏元素,然后在使用特定子类实例化时取消隐藏它们。另一种方法是根据你从哪里开始在一个类上设置一个布尔值,然后编写条件代码。后一种方式可能被认为有点代码味道,但它比复制故事板要好,这可能是一个非常糟糕的主意。

【讨论】:

回复老帖子总是好的!在我的故事板中复制故事板或控制器确实是我想要避免的。我想我明白你在说什么,但我不认为那是我正在寻找的解决方案。但是我已经有一段时间没有从事这个项目了。当我再次拿起它时,我会回到这个问题。同时,如果这对您有用,请任何人投票。

以上是关于在多个子类之间共享故事板视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个故事板uiviewcontroller为多个子类

通过替换 Windows 根控制器在多个故事板之间移动

iOS:在故事板中将子类从 UIView 更改为 UIScrollView

从多个故事板子类化 UIViewController

在多个故事板环境中展开 segue

UIButton子类在故事板中崩溃[重复]