NSButton州问题

时间:2017-07-04 00:55:04

标签: cocoa swift3 nsbutton

我有两个ViewControllers。 在VC1上我有搜索条件,在VC2上我有搜索结果。如果你想从VC2转到VC1,VC2就会被解雇。

在VC1上我有一个NSButton(样式检查,类型切换),默认情况下我希望它处于ON状态。 NSButton的目的是在结果中包含照片。

如果用户取消选中按钮并按下搜索,它将继续显示VC2,显示没有照片的搜索结果。

但是当用户返回VC1进行新搜索时,会发生不需要的行为: NSButton未经检查(我希望每次用户在VC1时都要检查它。此外,按钮是零。

为什么会发生这种情况,如何在每次关闭VC2时勾选按钮框?

我尝试启用它并将其设置为ONState但是因为它的nil会崩溃。

2 个答案:

答案 0 :(得分:0)

我设法通过添加

使其按照我想要的方式执行
switch.state=1

就在执行从VC1到VC2的segue之前。

但是,我不认为这是最优雅的解决方案,因为按钮仍为零。

更新: 我已经发现问题出现了,当它从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.
}
}

答案 1 :(得分:0)

每次控制器打开时设置状态都使用方法

-(void)viewWillAppear

要让viewControllers相互通信,您可以实现委托。这是一个非常好的教程:Link

另一种方法是与通知进行通信 - > Link

或者您可以在prepareForSegue等方法上设置值 - 具体取决于您用来控制控制器的内容。