Проблемы с состоянием NSButton

У меня есть два ViewController'а. В VC1 у меня есть критерии поиска, а в VC2 — результаты поиска. Если вы хотите перейти от VC2 к VC1, VC2 будет отклонен.

В VC1 у меня есть NSButton (проверка стиля, тип Switch), который по умолчанию я хочу, чтобы он был в состоянии ON. Целью NSButton является включение фотографий в результаты.

Если пользователь снимет флажок с кнопки и нажмет кнопку поиска, он перейдет к VC2, показывающему результаты поиска без фотографий.

НО, когда пользователь возвращается к VC1 для нового поиска, возникает нежелательное поведение: NSButton не отмечен (я хочу, чтобы он проверялся по умолчанию каждый раз, когда пользователь находится в VC1. Кроме того, кнопка нулевая.

Почему это происходит и как я могу сделать так, чтобы эта кнопка устанавливалась каждый раз при закрытии VC2?

Я попытался включить его и установить для него значение ONState, но, поскольку он равен нулю, он вылетит.


person Do2    schedule 04.07.2017    source источник
comment
Кнопку подключили?   -  person Willeke    schedule 04.07.2017
comment
Конечно, у меня есть! В первую очередь я не понимаю, почему кнопка становится нулевой...   -  person Do2    schedule 04.07.2017


Ответы (2)


Чтобы установить состояние каждый раз, когда ваш контроллер открывается, используйте метод

-(void)viewWillAppear

Чтобы позволить viewControllers общаться друг с другом, вы можете реализовать делегатов. Вот довольно хороший учебник: Ссылка

Другой подход – использовать уведомления – › Ссылка.

Или вы можете установить значения для таких методов, как prepareForSegue - в зависимости от того, что вы используете для имстантинации ваших контроллеров.

person Pat_Morita    schedule 07.07.2017
comment
Да, я понял, что моя проблема была связана с делегированием. Я добавлю новый ответ с примером. ps: у меня есть тег swift3 .. - person Do2; 07.07.2017

Мне удалось заставить его работать так, как я хочу, добавив

switch.state=1

непосредственно перед переходом от VC1 к VC2.

Однако я не думаю, что это самое элегантное решение, так как кнопка по-прежнему пуста.

ОБНОВЛЕНИЕ: я понял, что проблема возникает, когда он переходит от VC1 к VC2, VC1 становится нулевым, когда VC2 отклоняется, он также становится нулевым. Отсюда и крах. Одним из решений является использование делегатов.

VC1:

class FirstViewController: UIViewController,SecondViewControllerProtocol {

@IBOutlet var firstName: UITextField!
@IBOutlet var lastName: UITextField!
@IBOutlet var subscribeSwitch: UISwitch!

@IBAction func goToSecondVC(_ sender: Any) {
    let viewController = self.storyboard?.instantiateViewController(withIdentifier: String(describing: SecondViewController.self)) as! SecondViewController
    viewController.delegate = self
    self.present(viewController, animated: true, completion: nil)

}


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 dismissViewController() {
    if let viewController = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController"){
        subscribeSwitch.isOn=true
    }
}

}

VC2:

protocol SecondViewControllerProtocol {
func dismissViewController()
}



class SecondViewController: UIViewController {

var delegate:SecondViewControllerProtocol!


@IBAction func goBackToFirstVC(_ sender: Any) {
    self.dismiss(animated: true) {
        self.delegate!.dismissViewController()
    }
}


override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}
person Do2    schedule 04.07.2017