0

そのため、ブロックをセレクターとしてボタンに渡す方法を調べてみましたが、答えは必要以上に複雑に思えます。

doBlock;と呼ばれるメソッドとと呼ばれるブロック変数を使用して UILabel をサブクラス化し、blockToDoすべてのメソッドが行うのは callだけだとすると、次のblockToDo ();ようなことができませんでした。

myLabel.blockToDo = ^myBlock;   
[myButton addTarget: myLabel action: @selector (doBlock) forControlEvents: UIControlEventTouchUpInside];

それとも、私が気付いていないトラブルに巻き込まれるのでしょうか?

編集: つまり、ここには 2 つのことがあります。私が本当にやりたかったことと、私が尋ねた質問への答えです。それらは別のものです。

私の質問を表現する別の方法は、それを 2 つに分割することです。半分は、「単純なメソッドを UILabel に追加したい場合、それをサブクラス化してそのメソッドを追加できますか、それとも UILable のサブクラスが義務付けられている他のことがたくさんありますか?」残りの半分は、「doBlock;サブクラスにメソッドを追加することは、ブロックをセレクターとして渡す最も簡単な方法のようですが、これらのボードのすべての提案は、その目的のためにまったく新しいクラスを定義することであるように思われます.余分な作業がたくさんあります。なぜですか?」

ほとんどの人がその 2 番目の質問に取り組んでいるように見えますが、これは理解できることです。なぜなら、それは実際には元の質問のより明白な部分だからです。

しかし、私が本当にやりたかったことは、doBlock;メソッドを持つカテゴリを定義し、連想参照^myBlockを使用してivar をカテゴリ内に格納することです。カテゴリを使用して任意のクラスにブロックを追加するだけで、@selector (doBlock).

だから、私はこれをどのようにまとめるかわかりません。私が尋ねた質問は部分的に回答されましたが、私が本当にやりたかったことは、定式化された質問に直接関係していないことがわかりました. ベスト アンサーはどのように授与すればよいですか?

4

3 に答える 3

0

このアプローチでは、簡単に保持サイクルが発生する可能性があります。ブロックがコントローラーを参照しているとしましょう。

label.blockToDo = ^{
    [controller didTapLabel];
}

ブロックはコントローラーを保持するため、コントローラーの割り当てを解除することはできません。コントローラは最終リリースを受け取らないため、ビューを削除せず、ラベルはコールバックブロックを解放しません。

ブロックの内容に注意することでこれを回避できますが、コントローラーにブロックを保持し、ラベルのターゲット/アクションに接続されたセレクターを介してブロックを呼び出す方がクリーンだと思います。

于 2012-08-06T20:32:44.783 に答える