【问题标题】:NSButton state issuesNSButton 状态问题
【发布时间】:2017-07-04 00:55:04
【问题描述】:

我有两个 ViewController。 在 VC1 上我有搜索条件,在 VC2 上我有搜索结果。如果您想从 VC2 转到 VC1,则 VC2 将被关闭。

在 VC1 上,我有一个 NSButton(style Check, type Switch),默认情况下我希望它处于 ON 状态。 NSButton 的目的是在结果中包含照片。

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

但是当用户返回 VC1 进行新搜索时,会出现不需要的行为: NSButton 未选中(我希望在每次用户位于 VC1 时默认选中它。此外,该按钮为 nil。

为什么会发生这种情况,我怎样才能让它成为每次关闭 VC2 时都要勾选的按钮框?

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

【问题讨论】:

  • 你连接按钮了吗?
  • 当然,我有!主要是我不明白为什么按钮变成 nil...

标签: cocoa swift3 nsbutton


【解决方案1】:

要在每次打开控制器时设置状态,请使用该方法

-(void)viewWillAppear

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

另一种方法是与 Notifications 通信 -> Link

或者您可以在 prepareForSegue 之类的方法上设置值 - 取决于您用来启动控制器的内容。

【讨论】:

  • 是的,我发现我的问题是由于授权。我将用一个例子添加一个新的答案。 ps:我有一个swift3标签..
【解决方案2】:

我已经设法通过添加使其按我想要的方式执行

switch.state=1

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

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

更新: 我发现问题发生在从 VC1 到 VC2 时,VC1 变为 nil,当 VC2 被解除时,它也变为 nil。因此崩溃。一种解决方案是使用委托。

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.
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2013-06-24
    相关资源
    最近更新 更多