2015-10-21 4 views
1

У меня есть контроллер панели управления с двумя путями. Один - settingController Другой - loginController и contactListController. When i run the program the entry pint is set to contactListController and if login is false apps shown loginController`. После того, как значение входа установлено в значение true, и loginController будет уволен. Внизу у меня есть контроллер панели вкладок: ContactList | НастройкиКак вызвать функцию делегата без текущего контроллера

Когда я перехожу к настройкам, у меня есть кнопка LOGOUT, я хотел бы сделать это, когда я коснусь этого, как установить значение login на false? у меня нет SEGUE между 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) 
} 

Сначала появляется настройка контроллера. Как я могу изменить это значение по-другому?

UPDATE в списке контактов у меня есть

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

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

как насчет того, чтобы сделать bool общим экземпляром? – Lukas

+0

Я обновил свой вопрос – Wraith

+1

Почему бы не использовать NSUserdefaults? – Sam

ответ

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

Рассматривайте либо 1: использование уведомлений (для которых все заинтересованные контроллеры зарегистрированы в качестве наблюдателей) реагировать на изменения состояния сеанса, 2: перемещение состояния сеанса на что-то «выше» цепочка "(например, или« отвиснуть »от вашего делегата приложения) или 3: создание односеточного контроллера сеанса.

1 может использоваться с 2 и 3, а 2 или 3 позволяют получить доступ к текущему состоянию из любого места в вашем приложении. Я бы выбрал смесь 1 и 3.

Этот подход, как правило, освобождает вас от необходимости ходить и проверять иерархию контроллера, чтобы найти и установить один и тот же тигр на всех других контроллерах (что нехорошо, потому что оно настолько тесно связано, изменение иерархии и/или повторное использование VC в другом месте вероятно, сломать вещи).

Смежные вопросы