Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在模式关闭swift macOS后更改主控制器上的标签文本_Ios_Swift_Macos_Nstextfield - Fatal编程技术网

Ios 在模式关闭swift macOS后更改主控制器上的标签文本

Ios 在模式关闭swift macOS后更改主控制器上的标签文本,ios,swift,macos,nstextfield,Ios,Swift,Macos,Nstextfield,我使用委托从模式中获取字符串值。当模态关闭时,我试图使用该字符串更新标签文本。然而,我得到了一个错误:在隐式展开一个可选值:file时意外地发现了nil。我不知道如何解决这个问题。我认为这是因为视图尚未激活 import Cocoa class ViewControllerA: NSViewController, SomeDelegate { @IBOutlet weak var msgLabel: NSTextField! var s: String = "";

我使用委托从模式中获取字符串值。当模态关闭时,我试图使用该字符串更新标签文本。然而,我得到了一个错误:在隐式展开一个可选值:file时意外地发现了nil。我不知道如何解决这个问题。我认为这是因为视图尚未激活

import Cocoa

class ViewControllerA: NSViewController, SomeDelegate {
    @IBOutlet weak var msgLabel: NSTextField!

    var s: String = "";

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    func setDetails(s: String) {
        self.user = s;
        print("Notified", self.s) // <-- prints: Notified hello again
        msgLabel.stringValue = self.s <-- DOESN'T WORK
    }


    func showModal() -> Void {

        msgLabel.stringValue = "hello" // <--- WORKS
        let cbvc: NSViewController = {
            return self.storyboard!.instantiateController(withIdentifier: "ControllerBVC")
            as! NSViewController
        }()

        self.presentAsModalWindow(cbvc);
    }

    @IBAction func onBtn(_ sender: Any) {
        self.showModal();
    }
}

protocol SomeDelegate {
    func setDetails(s: String)
}


class ViewControllerB: NSViewController {

    @IBOutlet weak var textF: NSTextField!

    var delegate: SomeDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
        let vc = ViewControllerA()
        self.delegate = vc
    }

    @IBAction func onBtn(_ sender: Any) {
        DispatchQueue.main.async {
                        self.delegate?.setDetails(s: self.textF.stringValue)
                        self.dismiss("ControllerAVC")
                    }
    }
}
导入可可粉
类ViewControllerA:NSViewController,SomeDelegate{
@IBOutlet弱变量msgLabel:NSTextField!
var s:String=“”;
覆盖var representedObject:有吗{
迪塞特{
//更新视图(如果已加载)。
}
}
func集合详细信息(s:字符串){
self.user=s;

打印(“Notified”,self.s)/您有很多问题

ViewControllerB.viewDidLoad
中,您正在将
ViewControllerA
的新实例分配给
delegate
属性。不要这样做。您的viewDidLoad方法应如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
}
showmodel
方法中
ViewControllerA
应在
ViewControllerB
上指定自己为代表,然后再显示
ViewControllerB

func showModal() -> Void {
    let cbvc: NSViewController = {
        let vc = self.storyboard!.instantiateController(withIdentifier: "ControllerBVC")
        as! ViewControllerB
        vc.delegate = self
        return vc
    }()

    self.presentAsModalWindow(cbvc);
}
setDetails
方法中,只需将字符串直接指定给文本字段:

func setDetails(s: String) {
    msgLabel.stringValue = s
}

你有很多问题

ViewControllerB.viewDidLoad
中,您正在将
ViewControllerA
的新实例分配给
delegate
属性。不要这样做。您的viewDidLoad方法应如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
}
showmodel
方法中
ViewControllerA
应在
ViewControllerB
上指定自己为代表,然后再显示
ViewControllerB

func showModal() -> Void {
    let cbvc: NSViewController = {
        let vc = self.storyboard!.instantiateController(withIdentifier: "ControllerBVC")
        as! ViewControllerB
        vc.delegate = self
        return vc
    }()

    self.presentAsModalWindow(cbvc);
}
setDetails
方法中,只需将字符串直接指定给文本字段:

func setDetails(s: String) {
    msgLabel.stringValue = s
}