没有现有控制器如何调用委托函数

时间:2015-10-21 13:31:07

标签: swift swift2

我有两条路径的Tap Bar Controller。一个是settingController其他一个是loginControllercontactListController. When i run the program the entry pint is set to contactListController and if login is false apps shown loginController`。登录值设置为true并且loginController被关闭。在底部我有Tab Bar Controller:ContactList |设置

当我进入设置时,我有一个LOGOUT按钮,当我点击这个如何设置值登录为false时我想做什么?我在 ContactList SettingController

之间没有任何区别

这是我的ContactListController

class ContactsTableViewController: UITableViewController, SettingsControllerDelegate {

    let settingsController: SettingsController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("settingsController") as! SettingsController

    override func viewDidLoad() {
        super.viewDidLoad()
        settingsController.delegate = self
    }

    func didLogoutSuccessfully() {
        loggedIn = false
    }

}

这是设置控制器

protocol SettingsControllerDelegate {
    func didLogoutSuccessfully()
}

class SettingsController: UITableViewController {
     var delegate: SettingsControllerDelegate?

    fun tapButton() {
        self.delegate?.didLogoutSuccessfully() // Set login as false
    }

如果我添加了

override func viewDidLoad() {
    super.viewDidLoad(
    settingsController.delegate = self
    presentViewController(settingsController, animated: true, completion: nil)
}

首先显示我的控制器设置。如何以其他方式更改此值?

更新 在联系人列表中我有

var loggedIn: Bool = false {
        didSet {
            if loggedIn == true {
                self.configureView()
            }
        }
    }

override func viewDidAppear(animated: Bool) {
        if loggedIn == false {
            performSegueWithIdentifier("showLogin", sender: nil)
        }
        //tableView.reloadData()
    }

2 个答案:

答案 0 :(得分:0)

您可以使用UITabViewControllers.viewControllers方法在选项卡之间传递数据,该方法返回选项卡中视图控制器的数组

//in SettingsVC
func viewWillDisapear(){
   //assuming its in the second index of tabBar
   let contactVC = self.tabBarController.viewControllers[1] as ContactsTableViewController 
   contactVC.delegate = self
   contactVC.loggedIn = true //or false as you wish
   super.viewWillDisapear() 
}

答案 1 :(得分:0)

考虑1:使用通知(所有感兴趣的控制器都注册为观察者)来响应会话状态的变化,2:将你的会话状态转移到"更高的链接" (例如in或"悬挂"你的app委托),或者3:制作一个单独的会话控制器。

1可以与2和3一起使用,2或3可以更轻松地从应用程序中的任何位置访问当前状态。我自己和1和3混在一起。

这种方法通常使您不必走路并检查控制器层次结构,以便在所有其他控制器上找到并设置相同的thig(这是因为它如此紧密耦合;更改层次结构和/或重用其他地方的风险投资可能会破坏事情。)