gpt4 book ai didi

ios - 协调器模式 - 使用 Storyboard 而不是 Xib

转载 作者:搜寻专家 更新时间:2023-10-31 21:54:04 25 4
gpt4 key购买 nike

这是我第一次使用协调器模式。虽然我已经意识到它的重要性,但我有一个主要问题。
我经历了this关于这种模式的精彩文章。事实上,我能够使用它自己构建一个演示项目。不过有一点 - 建议使用 Xib。没有专门提到 Storyboards 不能使用,但是在文章结尾通过这些行,让我觉得不是这样:

With great power comes great responsibility (and limitations). To use this extension, you need to create a separate storyboard for each UIViewController. The name of the storyboard must match the name of the UIViewController‘s class. This UIViewController must be set as the initial UIViewController for this storyboard.

有人提到,在 Storyboards 的情况下,我们应该创建一个扩展并在 UIViewController 中使用它:

extension MyViewController: StoryboardInstantiable {
}

Storyboard可实例化:

import UIKit

protocol StoryboardInstantiable: NSObjectProtocol {
associatedtype MyType // 1
static var defaultFileName: String { get } // 2
static func instantiateViewController(_ bundle: Bundle?) -> MyType // 3
}

extension StoryboardInstantiable where Self: UIViewController {
static var defaultFileName: String {
return NSStringFromClass(Self.self).components(separatedBy: ".").last!
}

static func instantiateViewController(_ bundle: Bundle? = nil) -> Self {
let fileName = defaultFileName
let sb = UIStoryboard(name: fileName, bundle: bundle)
return sb.instantiateInitialViewController() as! Self
}
}

查询:

  1. 正如作者提到的,必须为每个 UIViewController 创建单独的 Storyboard,在 Coordinator 模式 中使用 Xib 如何更好?
  2. 为什么我们需要为每个 UIViewController 创建一个单独的 Storyboard ?我们不能通过不使用 segues 链接任何 UIViewController 来使用 UIViewController 的 Storyboard标识符吗?这样可以使用标识符调整上述扩展并轻松实现相同的目的。

最佳答案

我已经多次阅读该教程,它为每个 View Controller 使用了一个 Coordinator,这对我来说没有意义。我认为 Coordinator 的目的是将导航逻辑从 View Controller 转移到可以管理整个流程的更高级别的对象中。

如果您想从主 Storyboard初始化 ViewController,请改用此协议(protocol)和扩展:

import UIKit

protocol Storyboarded {
static func instantiate() -> Self
}

extension Storyboarded where Self: UIViewController {
static func instantiate() -> Self {
// this pulls out "MyApp.MyViewController"
let fullName = NSStringFromClass(self)

// this splits by the dot and uses everything after, giving "MyViewController"
let className = fullName.components(separatedBy: ".")[1]

// load our storyboard
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

// instantiate a view controller with that identifier, and force cast as the type that was requested
return storyboard.instantiateViewController(withIdentifier: className) as! Self
}
}

唯一的要求就是它使用的每个View controller都有这个协议(protocol),并且有一个和类同名的StoryboardID。

你可以这样使用它:

private func startBlueFlow() {
let vc = BlueViewControllerOne.instantiate()
vc.coordinator = self
self.navigationController.push(vc, animated: true)
}

免责声明协议(protocol)取自this article这也可以帮助你

更新:(添加引用)

Soroush Khanlou在有关 iOS 和 Redux 中的协调器模式的其他文章和教程中通常被引用和引用。他有一篇文章here (日期为 2015 年,objective-c 中的代码)您可能会发现这是一本有趣的读物。

关于ios - 协调器模式 - 使用 Storyboard 而不是 Xib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50389719/

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