Ios 在模式关闭swift macOS后更改主控制器上的标签文本
我使用委托从模式中获取字符串值。当模态关闭时,我试图使用该字符串更新标签文本。然而,我得到了一个错误:在隐式展开一个可选值:file时意外地发现了nil。我不知道如何解决这个问题。我认为这是因为视图尚未激活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 = "";
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
}