gpt4 book ai didi

iphone - 一个可以通过编程方式和在 IB 中实例化的 View Controller ?

转载 作者:行者123 更新时间:2023-12-03 20:17:15 25 4
gpt4 key购买 nike

View Controller FooViewController 在创建时需要进行一些初始化(其本身,而不是托管 View - 在 View 加载之前)。

我希望能够通过两种方式创建它:

  1. 以编程方式,可能带有一些参数:

    FooViewController *fooViewController = [[[FooViewController alloc] initWithSomeData:data] autorelease];[self.navigationController pushViewController:fooViewController animated:YES];
  2. 在 Interface Builder 中。

对于(1),我会这样编写初始化程序:

- (id)initWithSomeData:(Data *)data     // designated initializer{    if (self = [super initWithNibName:@"FooView" bundle:nil]) {        self.title = "Foo";        // perform initialization    }    return self;}- (id)init{    return [self initWithSomeData:nilOrSomeDefaultValue];}// ... other initializers that call the designated initializer

(我对 Nib 名称进行硬编码,因为 Controller 始终使用相同的 View 配置,并且它使用哪个 View 根本不关心调用者)

在 Interface Builder 中创建时,我希望最终结果与使用无参数 init 初始化对象相同。

现在如果我这样做:

- (id)initWithCoder:(NSCoder *)decoder{    return [self init];}

在 Interface Builder 的检查器中设置的 titlewantsFullScreenLayoutnibName 属性将被忽略,但没关系。 nibName 在 init 中进行硬编码,并且在其中设置 title,以防 Controller 以编程方式实例化。

问题是 parentViewController 未设置(默认的 initWithCoder: 将根据 NIB 中对象的层次结构进行设置)。

如何从 Nib 获取父对象?然后我会将 initWithCoder: 更改为:

- (id)initWithCoder:(NSCoder *)decoder{    if (self = [self init]) {        _parentViewController = [decoder parentObject];    }    return self;}

或者我应该使用一些不同的方法来创建可以通过编程方式和在 IB 中实例化的 Controller ?

最佳答案

不要,不要,不要尝试制作一个可以使用或不使用 Nib 的 View Controller 。这将是一场噩梦,因为 nibloading 使用一些正常的入口点并提供新的入口点,并且对于操作系统修订来说它会很脆弱。

你可以做的是让 View Controller 始终从 Nib 加载,然后给自己一个方便的初始化程序来遍历 Nib :

- (id) init {
return [[[self class] alloc] initWithNibNamed:@"MyNibName" bundle:nil];
}

然后您可以通过其他 Nib 以正常方式引用它,并且当您不想显式处理该 Nib 时,只需调用方便的 init 方法即可。

关于iphone - 一个可以通过编程方式和在 IB 中实例化的 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1059081/

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