-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];

Interface builder で、各ボタンのクラス プロパティを MoveButton に変更し、正しい IBOutlet に接続しました。ただし、ボタンが実際に UI でクリックされると、使用しようとしているインスタンス変数が空であるため、UI エラーがスローされます。コード内オブジェクトを UI 要素に適切に接続していないのでしょうか、それとも完全に間違った方法で行っているのでしょうか?

4

2 に答える 2

1

ラインを持つ

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

あなたの実装で-initWithWindow:は間違いです。Interface Builder でコントロール (自分の s) を(ファイルの所有者) に-windowDidLoad接続していると仮定すると、これらの値は が呼び出されるまでに上書きされます。コントロール ( のインスタンス) を Interface Builder に接続していない場合は、さらに多くの問題が発生します。MoveButtonMainWindowControllerMoveButton

MainWindowControllerの ivarsbase_cwをInterface Builderbase_ccwの適切な に接続したことを再確認したらMoveButton、ボタンを構成する行を に追加するだけです-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

リンクは適切に確立され、ivar を変更するメッセージが正しいオブジェクトに送信されました。

多くの人が与えられた助けに感謝します.

于 2012-12-30T18:17:45.650 に答える