3

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

这是一些类:

@interface ClassA: UIViewController

@interface ClassB: UIViewController

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

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

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

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

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

谢谢!

4

3 回答 3

4

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

我的意思是,你可以实现 3 个类:ClassP、ClassC1、ClassC2;将您的情节提要与实现委托协议的 ClassP 链接,然后在呈现之前(进入prepearForSegue?)您可以将 segue.destinationViewController(P 类型)的委托设置为您的 ClassC1 或 ClassC2 之一,这显然实现了协议。

示例代码(未测试):

P类

@protocol ClassPDelegate <NSObject>

- (void)foo;

@end

@interface ClassP : UIViewController
...
@end

C1 类和 C2 类

#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:对不起,你的英文比我的好!

于 2013-02-19T17:07:27.637 回答
0

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

于 2018-09-17T08:30:22.690 回答
-1

What you want to do, and what are possible aren't always the same thing. Casting doesn't magically turn a UIViewController into a ClassA view controller. You need to change the class in the storyboard to ClassA or ClassB. You can copy and paste the view you've created into as many other view controllers as you want. What's wrong with that?

于 2013-02-19T17:04:36.123 回答