我的代码有点问题,因此我无法调用函数。我在ViewController中创建了一个函数func changeLabelText(text: String) { mylabel.stringValue = text }
,我可以更新Label中的Text。当我尝试从Project中的另一个类调用该函数时,我收到运行时错误(EXC_BAD_Instr...
),调试器保留在我尝试更改Label的文本的行上,错误如下: fatal error: unexpectedly found nil while unwrapping an Optional value
。问题出在哪儿?有人可以帮帮我吗?
答案 0 :(得分:2)
关于"意外发现的nil,同时展开一个Optional值"错误,问题是您有一个可选项(从您提供的代码段判断,它必须是一个隐式解包的可选项),即nil
。最有可能的是,mylabel
是nil
。打印值或添加断点并检查调试器中的属性以进行确认。
如果是nil
,那么你必须找出原因。在我们的讨论中,结果是您试图在视图控制器中调用Log
事件:
ViewController().Log("asdf")
问题在于,它不会在现有视图控制器中调用Log
,而是ViewController()
表达式最终实例化一个新的,完全不相关的视图控制器,其出口未连接任何事情。因此,更新隐式打开的插座的尝试将导致您与我们共享的错误。
如果您希望此单独的类(数据库管理器对象)通知视图控制器事件以允许视图控制器更新UI,则有三种常用方法:
闭包/阻止的完成/进度处理程序。
这用于简单的接口,数据库需要在请求完成时通知视图控制器。
委托协议模式。
delegation模式(通常符合一些成熟的protocol)用于丰富的接口,数据库需要通知视图控制器各种不同类型的事件。
通知模式。
当您希望数据库对象与处理这些通知的任何内容之间存在松散耦合的接口时,将使用 Notifications。视图控制器可以将自己注册为defaultCenter()
NSNotificationCenter
的特定名称的任何通知的观察者。然后,数据库对象可以发布该名称的通知(通过userInfo
字典提供详细信息),并且视图控制器将被告知这些事件。
答案 1 :(得分:-1)
有些事情是你正确地调用视图控制器的一个实例
例如,如果类名是ViewController,则在您调用该函数的视图控制器中确保使用
让VC = ViewController()
然后使用VC.yourFunctionName
也代替stringValue使用.text