1

現在、ウィンドウに2Dゲームボード表現を描画するカスタムビュークラスがあります。

ユーザーがボードをクリックすると、mouseDown:イベントを使用して、マウスの位置からセルの座標を計算します(これは、カスタムビュークラス内で実行しています)。

- (void)mouseDown:(NSEvent*)theEvent {

    // Get position of mouse click:
    NSPoint point = [theEvent locationInWindow];
    NSPoint mousePos = [self convertPoint:point fromView:nil];

    // Calculate which cell has been clicked:
    int cellX = mousePos.x / gridSize.width;
    int cellY = mousePos.y / gridSize.height;

}

(上記のスニペットでは、「gridSize」は、ゲームボードの各セルの高さとwithを格納するために使用しているNSPointインスタンス変数です)

この情報の送信に使用できるIBActionスタイルのメッセージをコントローラークラスに作成することはできますか?

これが機能することを私が想像していた方法は次のとおりです。

  • カスタムビューでクリックされた座標のインスタンス変数を宣言します。
  • コントローラクラスに(IBAction)を実装します。
  • (id)senderポインターを使用して、座標を保持するインスタンス変数にアクセスします
  • IBActionをInterfaceBuilderのカスタムビューにリンクします

これを試すために、カスタムビューでインスタンス変数として「cellX」と「cellY」を宣言しました。次に、コントローラークラスに以下を実装しました。

-(IBAction)cellClicked:(id)sender { 

    [self setCellAtPosX:[sender cellX] PosY:[sender cellY];
}

(cellXとcellYはインスタンス変数へのアクセサーメソッドです)

予想していたように、それはそれほど単純ではなく、IBActionをカスタムビューにリンクすることはできません。これを実装するための私のアプローチに欠けているものはありますか?

これに必要なのは、インターフェイスビルダーにターゲットアクションメッセージの送信先を指示する何らかの通知機能だけだと想像できます。私の場合は、mouseDown:実装の最後ですが、これからどこから始めればよいかわかりません。

4

1 に答える 1

4

デリゲートパターンを使用してこれを実装する際の問題が少なくなる場合があります。つまり、ボードビューにIBOutletデリゲートプロパティを設定し、コントローラーにこのプロトコルを実装させます。Interface Builderでは、アウトレットを介してビューとコントローラーをリンクし、ビューは、mouseDown実装でそのデリゲートメソッドを呼び出します。次に例を示します。

- (void)mouseDown:(NSEvent*)theEvent {
   ...
   [self.delegate boardView:self didSelectCellAtX:x Y:y];
}
于 2012-11-29T20:25:39.730 に答える