【发布时间】:2016-09-19 15:55:37
【问题描述】:
我正在尝试将信息从控制器 A 传递到控制器 B。问题是,我想要:
简洁:尽量减少从
XCode到一些关键信息的自动完成。在将控制器推入堆栈之前,我想以一种简单的方式了解所需的确切参数。避免转场。据我了解,segue 在故事板中创建了很多紧密耦合。我不想依赖故事板来传递信息。 (每次我想将控制器 A 切换到另一个时,我都必须去情节提要进行一些更改)。我可能会在某个时候将我的应用拆分为多个故事板,处理转场可能会很烦人。
Beautiful:也许 Swift 可以提供我从未想过的 Swifty 解决方案。
我一开始一直试图完成的是将控制器作为协议推送。即使不可能,让我解释一下:
将控制器作为协议推送将使我能够准确了解我的属性。
没有与故事板相关的紧密耦合
许多控制器(A、C、D)可能想要推送 B 控制器,我可能会给它们每个不同的协议来推送控制器 B。也许 B 可能会出现在不同的情况下。
起初,我的代码看起来像这样(故事板扩展有效):
if let myBCustomVC = storyboard.instanciateControllerWithIdentifier(MyBCustomVC.self) as? myVCustomFromAProtocol{
myBCustomVC.AToB = self.data.count
self.navigationController?.pushViewController(myBCustomVC, animated: true)
}
protocol myVCustomFromAProtocol {
var AToB: Int {get set}
}
问题是,我无法将视图控制器向下推送到协议。我不得不通过一个丑陋的UINavigationController 扩展名来。这是完整的结果。
if let myBCustomVC = storyboard.instanciateControllerWithIdentifier(MyBCustomVC.self) as? myVCustomFromAProtocol{
myBCustomVC.AToB = self.data.count
self.navigationController?.pushViewController(vcToPush: myBCustomVC, animated: true)
}
extension UINavigationController{
func pushViewController(vcToPush: Any, animated: Bool){
if let vc = vcToPush as? UIViewController{
self.pushViewController(vc, animated: animated)
}
}
}
让我们面对现实吧,在实现我的前两个目标时,我将 Any 降级为 UIViewController,哇。
有什么方法可以避免紧密耦合,并以美观的方式将控制器推送到堆栈上,同时保持有限的可见性参数从第一个视图控制器(A)传递到第二个(B)。你怎么认为?为什么我不想这样做?
【问题讨论】:
标签: ios swift protocols swift3 swift-protocols