【问题标题】:Storyboard UIViewController with multiple class具有多个类的故事板 UIViewController
【发布时间】:2013-02-04 09:58:54
【问题描述】:

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

这是一些类:

@interface ClassA: UIViewController

@interface ClassB: UIViewController

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

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

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

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

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

谢谢!

【问题讨论】:

  • 你确定A类和B类真的需要是两个单独的类吗?

标签: ios objective-c xcode uiviewcontroller storyboard


【解决方案1】:

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

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

示例代码(未测试):

类P

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

【讨论】:

    【解决方案2】:

    只有当我用 xib 文件替换故事板中的几乎所有内容时,我的生活才会变得比以前轻松得多!

    【讨论】:

      【解决方案3】:

      您想做什么和可能做什么并不总是一回事。转换不会神奇地将 UIViewController 变成 ClassA 视图控制器。您需要将情节提要中的类更改为 ClassA 或 ClassB。您可以将创建的视图复制并粘贴到任意数量的其他视图控制器中。那有什么问题?

      【讨论】:

      • 在我看来这不是一个好的解决方案。我也面临这个问题。当您想要一个具有已定义 UI 的基类并且您拥有例如10 个应该具有相同 UI 的子类(或将在代码中完成的小更改)感觉在故事板中有 11 个 viewController 是错误的。所以你不能做好的 OOP 或继承。苹果的耻辱!
      猜你喜欢
      • 1970-01-01
      • 2012-09-30
      • 2012-12-16
      • 2012-04-12
      • 1970-01-01
      • 2015-07-07
      • 2023-03-05
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多