@IBAction在Swift中无法工作,尽管我可以在Interface Builder中连接它,它在Objective



在所有情况下,我都可以使用interface Builder将用户界面按钮连接到操作。但这些按钮适用于Objective-C,但不适用于Swift。

Objective-C示例(有效(:

- (IBAction)TogglePlaying:(id)sender {
(details snipped for brevity)
}

Swift示例(它不起作用,尽管它与按钮相连(:

@IBAction func Go(_ sender: Any) {
print("Going")
OutputText!.stringValue = InputText!.stringValue
}

我不知道会有什么不同,因为我在Swift中使用IBAction时发现的一切都表明我写得对。此外,在界面生成器中,我已经正确地设置了文件所有者的自定义类。

更新:

使用ios-在调试模式下,在界面生成器中查找按钮调用的操作-堆栈溢出在调试模式中查找界面生成器中按钮调用的操作

我用了";调试视图层次结构";,右键点击";NSButton-Go"在窗口小部件层次结构视图中;打印NSButton的说明-Go">

我得到了$13的打印说明:
<NSButton:0x7fac1b116250>

然后我做了:
po[0x7fac1b116250 allTargets]
错误:执行中断,原因:试图取消引用无效的ObjC对象或向其发送无法识别的选择器
进程已返回到表达式求值前的状态。

更新:

我尝试了
po[0x7faf38011790 target]
(该按钮的新地址(,但我得到了

更新:

TLWindow的完整代码,Swift格式:

import Cocoa
class TLWindow: NSWindowController {

@IBOutlet weak var InputText: NSTextField!
@IBOutlet weak var OutputText: NSTextField!

override var windowNibName: NSNib.Name? {
return NSNib.Name("TLWindow")
}

@IBAction func Go(_ sender: Any?) {
print("Going")
OutputText!.stringValue = InputText!.stringValue
}
}

我不知道如何在不做大量屏幕截图的情况下显示xib是正确连接的。但事实上;加油"按钮连接到";转到:"在";文件的所有者";。此外;文件的所有者";被设置为"0";TLWindow";,这节课。

您正在newDocument()中创建TLWindow的实例,但随后却让它超出范围。。。

试试这个:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
// add a property to "hang onto" the instance
var myTLWindow: TLWindow!

func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
newDocument(self)
}

// Create an app window
@IBAction func newDocument(_ sender: Any?) {
let wc = TLWindow()
// add this line
myTLWindow = wc
wc.showWindow(self)
}
}

最新更新