在实例化时使用代码更改故事板中的自定义类

Mic*_*sky 6 xcode objective-c ios

我有一个标签栏控制器和一堆相同的标签.每个选项卡的功能都不同,但UI都是相同的.在故事板中,我设计了一个选项卡的流和UI,并将其设置为基类.然后,当我创建选项卡时,我尝试对它们进行类型转换,然后将它们添加到选项卡栏,但它不起作用.

在故事板中,View Controller识别"TabView"具有自定义类"TabColor"

TabRed *red = (TabRed *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"];
TabBlue *blue = (TabBlue *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"];
Run Code Online (Sandbox Code Playgroud)

然而,TabColor中的loadView方法被调用,而不是TabRed/TabBlue.

此外,如果我nslog它的结果是一个TabColor对象:

NSLog(@"%@", red)
Run Code Online (Sandbox Code Playgroud)

预期:TabRed

实际:TabColor

wal*_*gan 6

TL;博士:

故事板和xib包含序列化对象的集合.在故事板中指定类意味着在加载故事板时将获得该类的实例.获得您正在寻找的行为的一种方法是使用cocoa/cocoa-touch中常见的委托模式.

长版

故事板和类似的xib/nib文件实际上是编码对象的集合.当您在故事板中指定某个视图是UICustomColorViewController时,该对象将表示为该类的实例的序列化副本.当故事板被加载instantiateViewControllerWithIdentifier:并被调用时,故事板中指定的类的实例将被创建并返回给您.在这一点上,你被困在你给的对象,但你没有运气.

由于看起来你想要做不同的事情,你可以构建你的视图控制器,以便使用委托由不同的类处理该功能.

创建协议以指定两个视图控制器之间要保持不同的功能.

@protocol ThingDoerProtocol <NSObject>
    -(void) doThing;
@end
Run Code Online (Sandbox Code Playgroud)

将一个委托属性添加到viewcontroller:

@interface TabColor
...
@property (strong, nonatomic) thingDoerDelegate;
Run Code Online (Sandbox Code Playgroud)

然后让您的新对象实现协议并执行您希望它们执行的操作.

@implementation RedTabDoer
    -(void) doThing {
         NSLog(@"RedTab");
    }
@end

@implementation BlueTabDoer
    -(void) doThing {
         NSLog(@"BlueTab");
    }
@end
Run Code Online (Sandbox Code Playgroud)

然后在加载故事板时创建并连接这些对象.

TabColor *red = [storyboard instantiateViewControllerWithIdentifier:@"TabView"];
red.thingDoerDelegate = [[RedTabDoer new] autorelease];

TabColor *blue = [storyboard instantiateViewControllerWithIdentifier:@"TabView"];
blue.thingDoerDelegate = [[BlueTabDoer new] autorelease];
Run Code Online (Sandbox Code Playgroud)

这应该允许您通过更改分配给控制器委托槽的对象类型来自定义视图控制器的功能.