2014-09-12 59 views
4

我试图设置一个登录屏幕(ViewController),该屏幕在成功登录后导致本身是导航的一部分的用户列表(UserTableViewController)控制器。在随后的屏幕上,如UserTableViewController应该可以注销。这会使用户回到初始登录屏幕ViewController。我真的很难以正确的方式连接这些屏幕。必须说,我没有很多与不同类型的塞格斯和/或代表这样的经验,具有一定的研究完成后,我去了一些试验:基本:正确连接多个(视图)控制器

  1. ViewController成功登录触发modal-segue到导航控制器(本身导致UserTableViewController
  2. UserTableViewController有一个注销按钮,可以触发另一个模式继续回到ViewController。我采取了这些模态赛段,因为首先,我不希望有一个导致自动创建的后退按钮或类似的层次结构,其次,我不想在这两个屏幕之间产生任何“麻烦”,其中一个导航控制器,而另一个没有。

......看起来这不是一种方法。一个循环之后有些事情会混淆,而屏幕正在改变错误的方式。我想一个莫代尔 - 塞格罗圈是不可能的,因为至少必须有父母和孩子。下一步试验:

  1. ViewController成功登录后,触发模式-SEGUE /推SEGUE导航控制器(本身导致UserTableViewController
  2. 要返回到登录界面我来实现,而不是代表在点击“注销”时触发的另一个细分 - 在这里,我面临的问题是,我无法正确设置UserTableViewController的代表preparingForSegueViewController。此时segue.destinationViewController无法降频为UserTableViewController,但仅限于NavigationController什么不允许我在目的地设置代表(UserTableViewController)。

第三审判是做同样像第二种方法,但实现从ViewController 直接UserTableViewController一个SEGUE。这可能工作,但现在我没有任何导航栏了,在我的UserTableViewController ...!

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

编辑: 我可以尝试设置导航控制器作为初始视图控制器,然后才让登录屏幕ViewController呈现/由UserTableViewController驳回 - 是一条可行之路还是有广为人知的最佳实践为那些登录查看场景?

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

回答

0

This post出现就是为了解决你所面临的问题,如果我理解正确。

而且,没有意思鸡蛋里挑骨头,但它的“模式”,而不是“模块化” :)

+0

感谢您的意见,我一直在努力!无论如何,我很好奇,如果有一种常用的方式来处理登录屏幕,从实际角度来看,初始视图控制器,但不是导航堆栈的一部分。当一个注销它返回 - 我想知道这个周期内的什么样的关系是最好的...此外,我想知道如何在这种情况下实现一个委托,导航控制器“阻止向下转换” 。 @Nicky – 2014-09-12 21:23:40

+0

我相信这个导航实际上不应该是这两个控制器中的任何一个的责任,而是一些负责应用程序流的协调器对象。如果你有一个场景需要你将用户登录到导航控制器的层次结构中?例如,他们的令牌过期了,您需要他们再次登录。 – Nicky 2014-09-12 21:35:28

+0

无论如何,首选的方法是让呈现控制器知道(通过委托或其他方式)呈现的控制器已完成其工作,因此它可以处理解雇。毕竟,进一步在导航中的控制器不应该真正意识到它在屏幕上的显示。 – Nicky 2014-09-12 21:39:18

0

我认为这可能是做这件事的一种可接受的方式:

  1. 登录视图(ViewController)是初始视图控制器
  2. 在登录成功的情况下:从登录视图导航控制器,处理模态-SEGUE后续视图
  3. 通过实施子类UIStoryboardSegue的启用在夫特驳回-塞格斯(需要这样写:@objc(DismissSegue) class DismissSegue: UIStoryboardSegue { ),其覆盖其执行()来(sourceViewController.presentingViewController!!).dismissViewControllerAnimated(true, completion: nil)
  4. 从随后的视图(在我的情况UserTableViewController辞退-SEGUE)返回到登录视图
  5. 实现内prepareForSegue每个的注销动作查看控制器允许用户注销

不过,如果有人知道更好的做法,我很高兴听到!

1

请考虑使用“unwind”segue。在ViewController创建一个函数,如下所示:从退出按钮的UserTableViewController退出符号,其是在顶部的第三个按钮

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

UserTableViewController控制拖动,并选择在选择unwindToThisViewController(或任何名称ViewController)。

现在,当您单击注销按钮时,您将返回到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 

    } 


} 

注意,从退出按钮开卷整个连接埋在故事板内。您可以通过查看Connections Inspector来确认是否发生了这一切。