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

10

我和Pedro 这里 有相同的问题,但对答案不满意,并且由于已经有了悬赏并获得了奖励,所以我创建了这个问题,并尽快添加一个悬赏。

我想在代码中创建或操作Segue(用黄色突出显示),使主视图是MFMasterViewController的多个子类之一(用红色突出显示)。

storyboard illustration

使用 Nibs 进行此操作时,我可以创建一个名为 SharedNib.xib 的 Nib,并将其类设置为 MFMasterViewController,然后创建我的子类,例如 MFMasterViewControllerSubclassAMFMasterViewControllerSubclassB 等等,并使用以下方式实例化任何一个子类...

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

或者...

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

有什么线索可以通过storyboard来解决这个问题吗?

我无法使用提供的答案来解决Pedro的问题,我的子类扩展超出了数据源和代理。


你成功完成了吗? - Vik
2个回答

0

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

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

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


是的,但每个视图控制器只能有一个标识符和一个子类。因此,使用“instantiateViewControllerWithIdentifier”无法获取Subclass A和Subclass B。 - Tieme
@Tieme,你不想切换一下你想要控制器的类吗?每个子类都可以有自己的标识符,但是如果你想在IB中实例化每个子类,你确实需要一个断开的视图控制器。这是你想避免的吗 - 每个子类都有一个场景? - rdelmar
8
我希望在IB中避免多个场景,我想在一个IB场景中派生出多个子类,并连接所有的插座! - Tieme

0

我知道这是一个旧帖子,但是因为它还没有得到答案,所以我想回复一下。这并不难做到。无论您想引用哪个超类,只需使用相应的子类引用即可。子类包含超类的所有内容。根据您希望执行转场的方式,有许多方法可以实现。如果您正在使用prepareForSegue,则可以像这样操作:

  1. 从按钮或其他控件创建一个segue。
  2. 给它分配一个ID。
  3. 将你的子类导入到.m文件中。
  4. 在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";
            }
       }
    

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


1
回复旧帖子总是不错的!在我的故事板中复制故事板或控制器正是我想要避免的。我想我明白你的意思,但我不认为那是我正在寻找的解决方案。然而,我已经有一段时间没有在这个项目上工作了。当我再次开始时,我会回到这个问题。同时,如果这对你有用,请任何人都可以点赞。 - Tieme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接