具有多个类的Storyboard UIViewController

时间:2013-02-19 16:20:23

标签: ios objective-c xcode uiviewcontroller storyboard

我希望我的故事板中有一个UIViewController由几个类实例化。所以我在我的故事板中让字段“class”为空(默认情况下,它是UIViewController?)。然后我用“MyGenericView”填充故事板ID。

这是一些课程:

@interface ClassA: UIViewController

@interface ClassB: UIViewController

MyGenericView包含我在ClassA和ClassB中构建视图所需的所有原型。以下是我实现ClassA

的方法
ClassA *myClass = (ClassA*)[storyboard instantiateViewControllerWithIdentifier:@"MyGenericView"];

最后,我的视图显示在应用中,但我的ClassA中的代码从未被调用过。 instantiateViewControllerWithIdentifier返回的对象为UIViewController,强制转换不起作用。

我不想用ClassA填充字段“class”,因为我想为ClassB重用此视图。但是我不想在我的故事板中复制这个视图。

Dunno,如果你觉得很清楚,我为我糟糕的英语道歉:)

谢谢!

3 个答案:

答案 0 :(得分:4)

我很想找到解决这个问题的方法 但唯一可行的(我认为) 是使用委托而不是子类。

我是说, 你可以实现3个类:ClassP,ClassC1,ClassC2; 将您的故事板与实现委托协议的ClassP相链接, 然后在呈现(进入 prepearForSegue ?)之前,您可以设置委托 segue.destinationViewController (P类型)到你的一个类ClassC1或ClassC2, 显然实现了协议。

(未测试)的示例代码:

ClassP

@protocol ClassPDelegate <NSObject>

- (void)foo;

@end

@interface ClassP : UIViewController
...
@end

ClassC1和ClassC2

#import "ClassP.h"
@property (nonatomic, weak) id <ClassPDelegate> delegate;

来电者等级

...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"mySegue"])
    {
        ClassC1 *classC1 = [[ClassC1 alloc] init];
        [(ClassP *)segue.destinationViewController setDelegate:classC1];
    }
}
...

我希望它有效! ps:我很抱歉,但你的英语比我好!

答案 1 :(得分:0)

只有当我用xib文件替换情节提要中的几乎所有东西时,我的生活才比以前容易得多!

答案 2 :(得分:-1)

你想做什么,有什么可能并不总是一样的。转换不会神奇地将UIViewController转换为ClassA视图控制器。您需要将故事板中的类更改为ClassA或ClassB。您可以根据需要将创建的视图复制并粘贴到任意数量的其他视图控制器中。这有什么问题?