基本:以正确的方式连接多个(视图)控制器

时间:2014-09-12 17:43:18

标签: swift uinavigationbar ios8 xcode6 downcast

我正在尝试设置一个登录屏幕(ViewController),该屏幕在成功登录后导致用户列表(UserTableViewController),该用户列表本身是导航控制器的一部分。在UserTableViewController之类的后续屏幕上,应该可以注销。这会将用户带回初始登录屏幕ViewController。我正在努力以正确的方式连接这些屏幕。必须说我对不同类型的segue和/或代表没有很多经验,因此,经过一些研究,我进行了一些试验:

  1. 成功登录ViewController会触发导航控制器的模态转换(本身会导致UserTableViewController
  2. UserTableViewController有一个退出按钮,可以触发另一个模态转换回ViewController。我采用了这些模态分段,因为首先,我不希望有一个层次结构导致自动创建的后退按钮或类似的东西,其次,我不想在这两个屏幕之间有任何“麻烦”,一个有一个导航控制器,而另一个没有。
  3. ......看起来这不是一种可行的方式。有些事情在一个循环后变得混乱,屏幕正在改变错误的方式。我想一个模态 - 圆圈是不可能的,因为至少必须有父母和一个孩子。下一次试验:

    1. 成功登录ViewController会触发导航控制器的模态 - segue / push-segue(它本身会导致UserTableViewController
    2. 要返回登录界面,我实现了一个委托而不是另一个segue,在点击“注销”时触发 - 这里我遇到的问题是我无法设置UserTableViewController的委托{正确preparingForSegue {1}}此时ViewController无法下载到segue.destinationViewController但仅限于UserTableViewController,但不允许我在目的地设置代理(NavigationController)。
    3. 第三次试验是像第二种方法那样做,但是从UserTableViewController实施一个segue 直接到ViewController。这可能有用,但现在我的UserTableViewController ......已经没有任何导航栏了!

      当然,我可以在第三个解决方案中进行手动修复,例如插入一个独立的导航栏,但两种方式似乎都没有效率。因此,我非常感谢一些提示,强调我一方面误解(完全)并在另一方面展示了一个很好的方法。非常感谢您的帮助!

      编辑: 我可以尝试将导航控制器设置为初始视图控制器,然后只让UserTableViewController显示/解除登录屏幕ViewController - 这是一种实用的方式,还是那些广为人知的最佳实践登录视图方案?

      只是一个视觉帮助: enter image description here

3 个答案:

答案 0 :(得分:1)

请考虑使用"放松" Segue公司。在ViewController创建一个函数如下:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
    yourLogoutCode()
}

UserTableViewController控件中 - 从“退出”按钮拖动到UserTableViewController的退出符号,这是顶部的第三个按钮,然后选择unwindToThisViewController(或您在{中选择的任何名称) {1}})。

现在,当您点击退出按钮时,您将返回ViewController并执行ViewController,您可以在其中输入您的退出代码。

以下是一个例子:

unwindToThisViewController

UserTableViewController:

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()
    }


}

请注意,从Logout按钮到展开的整个连接都隐藏在Storyboard中。您可以通过查看Connections Inspector来确认所有这些情况。

答案 1 :(得分:0)

如果我理解正确的话,

This post似乎可以解决您所面临的问题。

另外,对于挑剔并不意味着,但它是“模态”,而非“模块化”:)

答案 2 :(得分:0)

我认为这可能是一种可以接受的方式:

  1. 登录视图(ViewController)是初始视图控制器
  2. 如果登录成功:从登录视图到处理后续视图的导航控制器的模态 -
  3. 通过实现UIStoryboardSegue的子类(需要这样编写:@objc(DismissSegue) class DismissSegue: UIStoryboardSegue { )来覆盖其执行()到(sourceViewController.presentingViewController!!).dismissViewControllerAnimated(true, completion: nil)
  4. ,从而在Swift中启用dismiss-segues
  5. 从后续视图(在我的情况下为UserTableViewController)中将Dismiss-segue返回到登录视图
  6. 在每个允许用户注销的View Controller上的prepareForSegue中实现logout-action
  7. 但是,如果有人知道更好的练习,我很高兴听到!