我在Swift4中有一个应用程序,其中集成了一些Objective-C对象和桥接头。这可以很好地将数据发送到带有通知的swift部分。我想从rCNCViewController
中的swift函数中从其Objective-C对象AVR
获取数据。该类有一个实例变量motorsteps
,它在wakeFromNib中初始化为48,可以在整个类中使用。
swift等级:
class rViewController: NSViewController, NSWindowDelegate
{
}
子类:
class rCNCViewController:rViewController
{
...
var AVR = rAVRview()
...
Objective-C部分中的类:
@interface rAVRview:NSViewController <NSTableViewDataSource,NSTableViewDelegate>
{
...
IBOutlet id xy;
...
}
// variables
...
int motorsteps;
...
@end
在AVR中获取功能:
- (int)motorsteps
{
return motorsteps;
}
swift部分调用功能:
guard let steps:Int32 = AVR?.motorsteps() else {return}
返回的steps
值为0。观察调试器中对AVR
的函数调用,可以发现AVR中的motorsteps为0。AVR的其他对象都是0x00。
将motorsteps()
更改为返回常数值将正确返回该值。
在来自swift部分的调用之后,AVR
中的变量motorsteps
的值不变48。为什么来自swift部分的调用中的AVR对象无效?
awakeFromNib
仅在从XIB或Storyboard文件加载对象时调用。您正在使用init
创建AVR
:
var AVR = rAVRview()
在这种情况下,您不应该期望调用AVR的awakeFromNib
。如果您使用的是情节提要(或独立的XIB(,则需要将其定义为@IBOutlet
,并在情节提要编辑器中进行连接。如果手动创建这些视图,则需要在initWithFrame:
(或潜在的init:
(中初始化它们,而不是在awakeFromNib
中初始化。