UserTableViewController

UserTableViewController

我正在尝试设置一个登录屏幕 ( ViewController ),它会在成功登录后引导到一个用户列表 ( UserTableViewController ),它本身就是导航 Controller 的一部分。在诸如 UserTableViewController 之类的后续屏幕上,应该可以注销。这会将用户带回初始登录屏幕 ViewController 。我真的很难以正确的方式连接这些屏幕。必须说,我对不同类型的转场和/或代表没有太多经验,因此,在完成一些研究后,我进行了一些试验:

  • 成功登录 ViewController 会触发导航 Controller 的模态转场(它本身会导致 UserTableViewController )
  • UserTableViewController 有一个注销按钮,它会触发另一个 modal-segue 返回 ViewController 。我采用了这些模态转场,因为首先,我不想有一个导致自动创建后退按钮或类似的层次结构,其次,我不想在这两个屏幕之间有任何“麻烦”,一个有一个导航 Controller ,而另一个没有。

  • ……看来这不是办法。有些事情在一个循环后就会混淆,并且屏幕以错误的方式改变。我想模态转圈是不可能的,因为至少必须有 parent 和 child 。下一次审判:
  • 成功登录 ViewController 会触发导航 Controller 的模态转场/推送转场(这本身会导致 UserTableViewController )
  • 要返回登录屏幕,我实现了一个委托(delegate)而不是另一个 segue,在点击“注销”时触发 - 这里我面临的问题是我无法在 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/

    10-14 20:15