在多个子类之间共享storyboard viewcontroller

时间:2012-11-28 10:27:43

标签: ios cocoa-touch uistoryboard uistoryboardsegue

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

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

  

storyboard illustration

     

当使用Nibs执行此操作时,我可以创建一个Nib,SharedNib.xib&组   作为MFMasterViewController的类,然后创建我的子类   MFMasterViewControllerSubclassAMFMasterViewControllerSubclassB   等等然后实例化我想要使用的子类......

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

...或

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

     

关于如何使用故事板来解决这个问题的任何线索?

我不能在Pedro的问题上使用提供的答案,我的子类扩展超出了数据源&委派。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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";
            }
       }
    
  5. 由于您正在共享故事板场景并且没有场景的子类,因此这非常有限。例如,您必须隐藏元素,然后在使用特定子类实例化时取消隐藏它们。另一种方法是根据你所在的位置在一个类上设置一个布尔值,然后编写条件代码。后一种方式可能被认为是一种代码味道,但它比复制故事板更好,这可能是一个非常糟糕的主意。