objective-c – 在实例化时使用代码更改故事板中的自定义类
我有一个标签栏控制器和一堆相同的标签.每个选项卡的功能都不同,但UI都是相同的.在故事板中,我设计了一个选项卡的流和UI,并将其设置为基类.然后,当我创建选项卡时,我尝试对它们进行类型转换,然后将它们添加到选项卡栏,但它不起作用.
在故事板中,View Controller识别“TabView”具有自定义类“TabColor” TabRed *red = (TabRed *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"]; TabBlue *blue = (TabBlue *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"]; 然而,TabColor中的loadView方法被调用,而不是TabRed / TabBlue. 此外,如果我nslog它的结果是一个TabColor对象: NSLog(@"%@",red) 预期:TabRed 实际:TabColor 解决方法
TL;博士:
故事板和xib包含序列化对象的集合.在故事板中指定类意味着在加载故事板时将获得该类的实例.获得您正在寻找的行为的一种方法是使用cocoa / cocoa-touch中常见的委托模式. 长版 故事板和类似的xib / nib文件实际上是编码对象的集合.当您在故事板中指定某个视图是UICustomColorViewController时,该对象将表示为该类的实例的序列化副本.然后加载故事板并调用instantiateViewControllerWithIdentifier:时,将创建故事板中指定的类的实例并将其返回给您.在这一点上,你被困在你给的对象,但你没有运气. 由于看起来你想要做不同的事情,你可以构建你的视图控制器,以便使用委托由不同的类处理该功能. 创建协议以指定两个视图控制器之间要保持不同的功能. @protocol ThingDoerProtocol <NSObject> -(void) doThing; @end 将一个委托属性添加到viewcontroller: @interface TabColor ... @property (strong,nonatomic) thingDoerDelegate; 然后让您的新对象实现协议并执行您希望它们执行的操作. @implementation RedTabDoer -(void) doThing { NSLog(@"RedTab"); } @end @implementation BlueTabDoer -(void) doThing { NSLog(@"BlueTab"); } @end 然后在加载故事板时创建并连接这些对象. TabColor *red = [storyboard instantiateViewControllerWithIdentifier:@"TabView"]; red.thingDoerDelegate = [[RedTabDoer new] autorelease]; TabColor *blue = [storyboard instantiateViewControllerWithIdentifier:@"TabView"]; blue.thingDoerDelegate = [[BlueTabDoer new] autorelease]; 这应该允许您通过更改分配给控制器委托槽的对象类型来自定义视图控制器的功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |