-1

为了访问按钮中的 -mouseUp 和 -mouseDown 事件,我将 NSButton 子类化,并且我还想在对象中存储一些额外的变量:

@interface MoveButton : NSButton{

    unsigned char cmd[3];
    unsigned char stop[3];
    int r;
    struct libusb_device_handle *devh;

}

-(void)mouseDown:(NSEvent *)theEvent;
-(void)mouseUp:(NSEvent *)theEvent;
-(void) setcommand:(char*)first:(char*)second:(char*)third (libusb_device_handle*)device_handle;
-(void) setLight: (char*) light;

@end

在我的窗口控制器中,我有许多子类实例,每个实例都通过 IBOutlet 连接到 Interface Builder 中的一个元素。

@interface MainWindowController(){

    IBOutlet MoveButton * base_cw;
    IBOutlet MoveButton * base_ccw;

@end

在 initWithWindow 函数中,每个按钮都被初始化:

 base_cw = [[MoveButton alloc] init];
 base_ccw = [[MoveButton alloc] init];
 [base_cw setcommand:"00" :"00" :"00":devh];
 [base_ccw setcommand:"00" :"00" :"00":devh];

在界面生成器中,我已将每个按钮的类属性更改为 MoveButton 并将其连接到正确的 IBOutlet。但是,当实际单击按钮时,会引发 UI 错误,因为它尝试使用的实例变量为空。是我没有将代码内对象与 UI 元素正确连接,还是我只是以错误的方式进行操作?

4

2 回答 2

1

有线条

base_cw = [[MoveButton alloc] init];
base_ccw = [[MoveButton alloc] init];

在你的执行中-initWithWindow:是一个错误。-windowDidLoad假设您已在 Interface Builder 中将控件(您MoveButton的 s)连接到MainWindowController(文件的所有者),这些值将在调用时被覆盖。如果您没有在 Interface Builder 中连接控件(的实例MoveButton),您将遇到更多问题。

在仔细检查您已连接MainWindowController的 ivarsbase_cw和Interface Builderbase_ccw中的适当MoveButtons 之后,您只需将配置按钮的行添加到-windowDidLoad

- (void)windowDidLoad
{
    //...
    [base_cw setcommand:"00" :"00" :"00":devh];
    [base_ccw setcommand:"00" :"00" :"00":devh];
}

您的选择器setcommand::::不符合 Objective-C 约定。一个更好的名字应该是

- (void)setFirstCommand:(char *)firstCommand 
        secondCommand:(char *)secondCommand 
        thirdCommand:(char *)thirdCommand 
        deviceHandle:(libusb_device_handle *)deviceHandle;

请注意每个参数的标签使用(secondCommandforsecondCommand等)和驼峰大小写的使用(setFirstCommand:...而不是 `setfirstcommand:... 等)。

于 2012-12-29T17:17:51.220 回答
0

固定的!通过使用声明

IBOutlet MoveButton * base_cw;

它并没有真正将代码内对象链接到 UI 对象。

将其替换为:

IBOutlet id base_cw

链接已正确建立,更改 ivars 的消息正在发送到正确的对象。

非常感谢提供的帮助。

于 2012-12-30T18:17:45.650 回答