我正在尝试设置一个登录屏幕 ( ViewController
),它会在成功登录后引导到一个用户列表 ( UserTableViewController
),它本身就是导航 Controller 的一部分。在诸如 UserTableViewController
之类的后续屏幕上,应该可以注销。这会将用户带回初始登录屏幕 ViewController
。我真的很难以正确的方式连接这些屏幕。必须说,我对不同类型的转场和/或代表没有太多经验,因此,在完成一些研究后,我进行了一些试验:
ViewController
会触发导航 Controller 的模态转场(它本身会导致 UserTableViewController
) UserTableViewController
有一个注销按钮,它会触发另一个 modal-segue 返回 ViewController
。我采用了这些模态转场,因为首先,我不想有一个导致自动创建后退按钮或类似的层次结构,其次,我不想在这两个屏幕之间有任何“麻烦”,一个有一个导航 Controller ,而另一个没有。 ……看来这不是办法。有些事情在一个循环后就会混淆,并且屏幕以错误的方式改变。我想模态转圈是不可能的,因为至少必须有 parent 和 child 。下一次审判:
ViewController
会触发导航 Controller 的模态转场/推送转场(这本身会导致 UserTableViewController
) UserTableViewController
上的 preparingForSegue
中正确设置 ViewController
的委托(delegate)。此时 segue.destinationViewController
不能向下转换为 UserTableViewController
,而只能向下转换为 NavigationController
,这不允许我在目的地( UserTableViewController
)设置委托(delegate)。 第三次试验是在第二种方法中做同样的事情,但从
ViewController
实现一个 segueUserTableViewController
直接。这可能有效,但现在我的 UserTableViewController
上没有任何导航栏了......!当然,我可以在第三种解决方案中进行手动修复,例如插入独立导航栏,但两种方法似乎都没有效率。因此,我非常感谢一些提示,一方面突出我误解(完全)的内容,另一方面展示了一种很好的方法。非常感谢您的帮助!
编辑:
我可以尝试将导航 Controller 设置为初始 View Controller ,然后让
ViewController
呈现/关闭登录屏幕 UserTableViewController
- 这是一种实用的方法还是那些登录 View 场景有广为人知的最佳实践?只是一个视觉帮助:
最佳答案
请考虑使用“展开”转场。在 ViewController
中创建一个函数,如下所示:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
yourLogoutCode()
}
在
UserTableViewController
中,从 Logout 按钮控制拖动到 UserTableViewController
的退出符号,这是顶部的第三个按钮,然后选择 unwindToThisViewController
(或您在 ViewController
中选择的任何名称)。现在,当您单击 Logout 按钮时,您将返回
ViewController
并执行 unwindToThisViewController
,您可以在其中放置您的注销代码。下面是一个例子:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func yourLogoutCode() {
println("Logging Out ...")
}
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
self.yourLogoutCode()
}
}
和 UserTableViewController:
import UIKit
var selectedRow = -1
class UserTableViewController: UITableViewController {
var firstArray = ["Item1","Item2","Item3","Item4"]
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return firstArray.count
}
let nameOfCell = "Cell"
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(nameOfCell, forIndexPath: indexPath) as UITableViewCell
cell.textLabel!.text = firstArray[indexPath.row]
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
selectedRow = indexPath.row
}
}
请注意,从 Logout 按钮到 unwind 的整个连接都隐藏在 Storyboard 中。您可以通过查看 Connections Inspector 来确认所有这些都在发生。
关于swift - 基本 : Connecting multiple (View-)Controllers the right way,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25813893/