故事板UIViewController与多个类

3
我希望我的故事板中有一个 UIViewController 的实例,可以由几个类来实现。因此,我在我的故事板中将“类”字段留空(默认情况下是 UIViewController),然后我用“MyGenericView”填充了故事板 ID。
以下是一些类:
@interface ClassA: UIViewController

@interface ClassB: UIViewController

MyGenericView包含我在ClassAClassB中构建视图所需的所有原型。以下是我如何实例化ClassA

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

最终,我的观点在应用程序中显示,但是我的ClassA中的代码从未被调用。由instantiateViewControllerWithIdentifier返回的对象是一个UIViewController,强制转换不起作用。

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

不知道这对你是否清楚,我为我的糟糕英语道歉:)

谢谢!


你确定类A和类B真的需要是两个不同的类吗? - Firoze Lafeer
3个回答

4
我思考着如何解决这个问题,但我认为唯一可行的方法是使用代理而不是子类化。
我的意思是,您可以实现3个类:ClassP、ClassC1和ClassC2;将故事板与实现委托协议的ClassP链接,然后在呈现之前(在prepearForSegue中?)将P类型的segue.destinationViewController的代理设置为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];
    }
}
...

希望它能够起作用!附注:对不起,但是你的英语比我好!

0

只有当我将Storyboard中的几乎所有内容替换为XIB文件时,我的生活才比以前更容易!


-1

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


5
在我看来,这不是一个好的解决方案。我也遇到了这个问题。当您想要一个具有定义的UI的基类,并且您有10个子类应该具有相同的UI(或在代码中进行的小更改),在storyboard中拥有11个viewControllers感觉很不对。因此,您无法实现良好的面向对象编程或继承。苹果真可耻! - Sebastian

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