4

私はbarButtonを作成しています。これを押すと、UITableViewの編集モードがyesに設定されます。これが私のコードです:

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @"Edit"
                                                                             style: self.navigationController.navigationItem.leftBarButtonItem.style
                                                                            target: self
                                                                             action: ];

私が理解していないのは、actionそこでコードブロックを実行できるようにするために、パーツの引数として何を入れる必要があるかということです。簡単に言えば@selector(someMethod)、1行か2行しか実行しておらず、別のメソッドを作成しても意味がありません。

助けてくれてありがとう!

4

2 に答える 2

8

pgbのコメントに加えて、このようなものを書くと問題が解決します:

@interface PJBlockHolder

+ (id)blockHolderWithBlock:(dispatch_block_t)block;
- (void)invoke;

@end

/* obvious implementation; copy the block, issue it upon invoke */

と:

[[UIBarButtonItem alloc] initWithTitle: @"Edit"
    style: self.navigationController.navigationItem.leftBarButtonItem.style
    target: [PJBlockHolderWithBlock:^{ /* your code here */ }]
    action:@selector(invoke) ];

これで、ブロックをラップして特定のセレクターで発行するカスタム オブジェクトが作成されました。

編集: 以下に示すように、UIControls はターゲットを保持しません。したがって、おそらく最も簡単な方法は、ブロック ホルダーの有効期間をコントロールの有効期間に結び付けることです。これは必ずしも理想的ではありません。これは、コントロールを有効にしたままターゲットとして後で削除すると、ホルダーの有用性が失われるためです。ただし、ほとんどの場合に適していると思われます。

オプションは、Objective-C の組み込み関連オブジェクトを使用するか、任意のキー付きオブジェクトを格納できるを与えてUIControlから継承するという事実を使用するかのいずれかです。UIViewCALayer

Justin Spahr-Summers は、下のコメントで前者の十分に文書化されたパブリック ドメインの実装へのリンクを示しているため、議論の目的で、ハッキーではありますが、後者の例を示します。

PJBlockHolderWithBlock *blockHolder = [PJBlockHolderWithBlock:^{ /* your code here */ }];
UIBarButtonItem *barButtonItem =
    [[UIBarButtonItem alloc] initWithTitle: @"Edit"
        style: self.navigationController.navigationItem.leftBarButtonItem.style
        target: blockHolder
        action:@selector(invoke) ];
[barButtonItem.layer setValue:blockHolder forKey:@"__myBlockHolderKey__"];
于 2012-07-03T20:22:31.190 に答える
2

思い通りにはできません。パラメーターは、オブジェクトと、そのtarget: action:オブジェクトで呼び出されるセレクターを送信することを目的としています。私の知る限り、ブロックを使用する同等の API はありません。

于 2012-07-03T20:19:08.570 に答える