在所有情况下,我都可以使用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)
}
}