gpt4 book ai didi

objective-c - 实例化时使用代码更改 Storyboard中的自定义类

转载 作者:可可西里 更新时间:2023-11-01 03:44:10 26 4
gpt4 key购买 nike

我有一个标签栏 Controller 和一堆相同的标签。每个选项卡仅在功能上有所不同,但 UI 都是相同的。在 Storyboard 中,我设计了一个选项卡的流程和 UI,并将其设置为基类。然后,当我创建选项卡时,我尝试在将它们添加到选项卡栏之前对它们进行类型转换,但它没有用。

在 Storyboard 中, 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;博士:

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

长版

Storyboard 和类似的 xib/nib 文件,实际上是一组经过编码的对象。当您指定某个 View 是 Storyboard中的 UICustomColorViewController 时,该对象表示为该类实例的序列化副本。然后加载 Storyboard 并调用 instantiateViewControllerWithIdentifier: 时,将创建 Storyboard 中指定的类的实例并将其返回给您。在这一点上,您被给定的对象困住了,但您并非不走运。

因为看起来您想要做不同的事情,您可以构建 View Controller ,以便该功能由使用委托(delegate)的不同类处理。

创建一个协议(protocol)来指定您希望在两个 View Controller 之间有所不同的功能。

@protocol ThingDoerProtocol <NSObject>
-(void) doThing;
@end

将委托(delegate)属性添加到您的 View Controller :

@interface TabColor
...
@property (strong, nonatomic) thingDoerDelegate;

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

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

@implementation BlueTabDoer
-(void) doThing {
NSLog(@"BlueTab");
}
@end

然后在加载 Storyboard时创建并连接这些对象。

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

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

这应该允许您通过更改分配给 Controller 委托(delegate)插槽的对象类型来自定义 View Controller 的功能。

关于objective-c - 实例化时使用代码更改 Storyboard中的自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12188886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com