我在prepareForSegue函数中初始化容器视图控制器,如下所示:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
initialiseTopViewController(for: segue)
initialiseMessagesViewController(for: segue)
initialiseToolbarViewController(for: segue)
initialiseTicketViewController(for: segue)
}由于segue标识符上的guard条件,这些函数中只有一个实际上将在每个segue上运行。如果其中一个函数执行,它就不会继续尝试执行其他函数,我如何才能这样做呢?有比仅仅使用if...else if块更好的方法吗?
发布于 2018-11-28 15:21:19
类似于@rob的建议,让每个函数返回一个Bool,并通过一个包含所有函数的数组循环,使其完全由数据驱动。
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let funs = [ initialiseTopViewController(for:),
initialiseMessagesViewController(for:),
initialiseToolbarViewController(for:),
initialiseTicketViewController(for:) ]
for fun in funs {
if fun(segue) {
break
}
}
}发布于 2018-11-28 15:17:46
一种解决方案是使每个initialise函数在处理segue (否则为false )时返回true。然后:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
_ = (false
|| initialiseTopViewController(for: segue)
|| initialiseMessagesViewController(for: segue)
|| initialiseToolbarViewController(for: segue)
|| initialiseTicketViewController(for: segue)
)
}
private func initialiseTopViewController(for segue: UIStoryboardSegue) -> Bool { ... }
private func initialiseMessagesViewController(for segue: UIStoryboardSegue) -> Bool { ... }
private func initialiseToolbarViewController(for segue: UIStoryboardSegue) -> Bool { ... }
private func initialiseTicketViewController(for segue: UIStoryboardSegue) -> Bool { ... }另一个解决方案是将适当的测试提升到prepare(for:sender:)中,例如使用switch
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch (segue.identifier ?? "", segue.destination) {
case (_, let dest as TopViewController): initialiseTopViewController(dest)
case (_, let dest as MessagesViewController): initialiseMessagesViewController(dest)
case ("toolbar", let dest as MultipurposeViewController): initialiseToolbarViewController(dest)
case ("ticket", let dest as MultipurposeViewController): initialiseTicketViewController(dest)
default: super.prepare(for: segue, sender: sender)
}
}
private func initialiseTopViewController(_ controller: TopViewController) { ... }
private func initialiseMessagesViewController(_ controller: MessagesViewController) { ... }
private func initialiseToolbarViewController(_ controller: MultipurposeViewController) { ... }
private func initialiseTicketViewController(_ controller: MultipurposeViewController) { ... }发布于 2018-11-28 16:29:57
我建议使用switch语句检查/转换各种类型的destination,并将该类型值传递给适当的方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.destination {
case let destination as FooViewController: prepare(destination)
case let destination as BarViewController: prepare(destination)
case let destination as BazViewController: prepare(destination)
default: super.prepare(for: segue, sender: sender)
}
}
func prepare(_ destination: FooViewController) {
destination.foo = foo
}
func prepare(_ destination: BarViewController) {
destination.bar = bar
}
func prepare(_ destination: BazViewController) {
destination.baz = baz
}这个switch只调用适当的方法,并将这些单独的方法从根本上不需要执行任何guard语句。
https://stackoverflow.com/questions/53522498
复制相似问题