Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Can';t在Swift中从其他类更新标签_Swift_Cocoa - Fatal编程技术网

Can';t在Swift中从其他类更新标签

Can';t在Swift中从其他类更新标签,swift,cocoa,Swift,Cocoa,我的代码有点小问题,因此无法调用函数。我在ViewController中创建了一个函数func changeLabelText(text:String){mylabel.stringValue=text},可以用它更新标签中的文本。当我尝试从项目中的另一个类调用该函数时,我得到一个运行时错误(EXC\u BAD\u Instr…),调试器在我尝试更改标签文本的行上挂起,错误为:致命错误:在展开可选值时意外发现nil。问题在哪里?有人能帮帮我吗 您是否正确调用了视图控制器的实例 e、 g如果类名为

我的代码有点小问题,因此无法调用函数。我在ViewController中创建了一个函数
func changeLabelText(text:String){mylabel.stringValue=text}
,可以用它更新标签中的文本。当我尝试从项目中的另一个类调用该函数时,我得到一个运行时错误(
EXC\u BAD\u Instr…
),调试器在我尝试更改标签文本的行上挂起,错误为:
致命错误:在展开可选值时意外发现nil
。问题在哪里?有人能帮帮我吗

您是否正确调用了视图控制器的实例

e、 g如果类名为ViewController,则在调用函数的视图控制器中,确保使用

设VC=ViewController()

然后使用VC.yourFunctionName

另外,与stringValue use.text

不同的是,关于“在展开可选值时意外发现nil”错误,问题是您有一个可选值(从您提供的代码段判断,它必须是隐式展开的可选值)
nil
。很可能,
mylabel
nil
。打印值或添加断点并在调试器中检查属性以确认

如果是
nil
,则必须找出原因。在我们的讨论中,您试图调用视图控制器中的
Log
事件:

ViewController().Log("asdf")
问题在于,这不会在现有视图控制器中调用
Log
,而是
ViewController()
表达式最终实例化了一个新的、完全不相关的视图控制器,其出口没有连接到任何东西。因此,尝试更新隐式打开的出口将导致您与我们共享的错误

如果希望此单独的类(数据库管理器对象)通知视图控制器事件,以便允许视图控制器更新UI,有三种常见方法:

  • 作为闭包/块的完成/进度处理程序

    这用于简单界面,其中数据库需要在请求完成时通知视图控制器

  • 委托协议模式

    该模式(通常符合一些公认的模式)用于丰富的接口,其中数据库需要向视图控制器通知各种不同类型的事件

  • 通知模式

    当您希望在数据库对象和处理这些通知的任何对象之间有一个松散耦合的接口时,可以使用。视图控制器可以在
    NSNotificationCenter
    defaultCenter()
    中将自己注册为特定名称的任何通知的观察者。然后,数据库对象可以发布该名称的通知(通过
    userInfo
    字典提供详细信息),视图控制器将收到这些事件的通知


  • 用相关代码更新您的问题。您能提供所看到错误的详细信息吗?包括行和错误消息。我最初的怀疑是,这与您用来调用该方法的队列有关,但错误的详细信息应该能提供更好的线索。re
    stringValue
    vs
    text
    ,最初这个问题被标记为iOS,因此您正确地认为
    UILabel
    使用
    text
    。OP澄清/纠正了这个问题,清楚地表明它是Mac OS X中的
    NSLabel
    ,在这种情况下
    stringValue
    是正确的。此外,
    let vc=ViewController()
    模式几乎肯定是不对的:首先,他甚至可能在Mac OS项目中没有vc。其次,在不引用NIB和/或故事板标识符的情况下实例化VC是此类问题的常见根源,而不是解决方法。在我们走这条路之前,我们需要更多地了解应用程序的设计。@Michael_mhr-让我们来看看。