gpt4 book ai didi

ios - 如何在 Swift 中使用协议(protocol)初始化 UIView 和 UIViewController

转载 作者:可可西里 更新时间:2023-11-01 00:55:24 36 4
gpt4 key购买 nike

我最近一直在尝试使用从 René Cacheaux 中学到的技巧构建 iOS View 从代码轻松初始化 UIViewControllers:

class NiblessViewController: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
}

@available(*, unavailable, message: "Loading this view controller from a nib is unsupported.")
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

@available(*, unavailable, message: "Loading this view controller from a nib is unsupported.")
required init?(coder aDecoder: NSCoder) {
fatalError("Loading this view controller from a nib is unsupported")
}
}

然后,您可以在自定义 View Controller 类中继承 NiblessViewController,而无需每次都覆盖初始化程序:

class CustomViewController: NiblessViewController {
// ...
}

这在使用 vanilla UIViewController 时效果很好,但我想不出将它与其他 View Controller 类一起使用的好方法(例如 UITableViewControllerUINavigationController) 而无需为每个 View Controller 类型(例如 NiblessTableViewControllerNiblessNavigationController)创建单独的 Nibless 类,包含确切的相同的代码。

我尝试过的一件事是使用这样的协议(protocol)扩展:

protocol Nibless {}

extension Nibless where Self: UIViewController {
// Same initialization code as above
}

这样做,我得到三个错误:

  1. 'super' cannot be used outside of class members
  2. 'required' initializer in non-class type 'NiblessViewController'
  3. initializer does not override a designated initializer from its superclass

关于在没有重复代码的情况下执行此操作的好方法有什么想法吗?

最佳答案

我完全理解为什么你追求你现在的样子(禁止 IB),但目前这是不可能的。它也不是 super 实用。让我解释一下:

  • init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)方法是类的指定初始化程序。你应该在初始化 UIViewController 时使用它并将其标记为不可用不是正确的行为。
  • 对于 UIViewController 的其他子类它们每个都有自己的初始值设定项(如 UITableViewController(style:) ),您的协议(protocol)中不会包含这些。
  • 您可以在协议(protocol)中将方法标记为不可用,但仅限 @objc协议(protocol),在我对 Playground 的简短测试中,并没有像我希望的那样工作(不过,如果我们能做到,那就太酷了)。
  • 但是,即使我们能够将协议(protocol)项标记为不可用,我也不相信我们可以通过该技术禁止访问类中的现有成员。

我认为您最好的选择可能是为每个 UIViewController 创建您自己的“基础”子类你想要的子类,并明确禁止在那里的 IB。在代码中初始化的好处之一是你可以去掉 Optional<T>。必须乱扔 IB 绑定(bind) View Controller 的属性。

Here's a gist that I created which has the base UIViewController subclass.

关于ios - 如何在 Swift 中使用协议(protocol)初始化 UIView 和 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50221234/

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