gpt4 book ai didi

ios - 通过覆盖它的指定初始化器从 Storyboard 中获取 UIVIewController

转载 作者:搜寻专家 更新时间:2023-11-01 05:40:58 26 4
gpt4 key购买 nike

在 Objective-C 中,我经常像这样重写 UIViewController 子类的 init

- (id)init
{
self = [[UIStoryboard storyboardWithName:@"..." bundle:nil] instantiateViewControllerWithIdentifier:@"..."];
return self;
}

这样当我需要使用它时,我可以简单地调用id controller = [MyViewController new]

是否可以在 Swift 中做类似的事情,以便我可以调用 let controller = MyViewController() 来获取从 Storyboard实例化的 View Controller ?

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
// you can't assign self
self = UIStoryboard(name: "...", bundle: nil).instantiateViewControllerWithIdentifier("...")

// you can't return anything other than nil
return UIStoryboard(name: "...", bundle: nil).instantiateViewControllerWithIdentifier("...")
}

我知道我可以有类函数

class func controller -> instancetype {
return UIStoryboard(name: "...", bundle: nil).instantiateViewControllerWithIdentifier("...")
}

但是调用 MyViewController.controller() 并不像 MyViewController() 那样直接 - 如果我永远不会在没有 Storyboard的情况下使用 MyViewController,不是吗使其成为指定的初始化器有意义吗?

最佳答案

您将分配与初始化混合在一起。

init 初始化已分配的对象。

instantiateViewControllerWithIdentifier:实例化(分配和初始化) View Controller 对象。

简而言之,工厂方法是 alloc init 的替代品。

尝试在 init 中调用 instantiate 就像调用 [[[[Class alloc] init] alloc] init]。您所做的(在您的 Objective C 代码中)不是初始化,而是丢弃分配并交给您进行初始化的对象,并将其替换为单独分配和初始化的对象。

为了可读性(您和其他理解代码的人),我建议将 init 与 alloc 区分开来。人们理解并期望 init 初始化它的对象,但不会期望您的 init 分配它的对象。

关于ios - 通过覆盖它的指定初始化器从 Storyboard 中获取 UIVIewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539311/

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