0

ターゲットをセレクターに設定する方法を知りたいです。この電話をかけたい >>

    sortedArray = [views sortedArrayUsingSelector:@selector(compareWithUnit:)];

問題は、私のcompareWithUnit機能がLogUnitクラスにあることです。LogUnitclassでセレクターを探すようにコンパイラーに指示するにはどうすればよいですか?

views配列には (UIViewControllers) オブジェクトのみが含まれており、配列を結果LogUnitで並べ替えたいと考えています。views[LogUnit dayTime]

- (NSComparisonResult) compareWithUnit:(LogUnit*) unit;
{
    return [[self dayTime] compare:[unit dayTime]];
}
4

2 に答える 2

2

NSArrayリファレンスから:

  - (NSArray *)sortedArrayUsingSelector:(SEL)comparator

比較メッセージは、配列内の各オブジェクトに送信され、単一の引数として配列内の別のオブジェクトを持ちます。

なので、comparator配列を構成するオブジェクトのメソッドであることが期待されます。ソートすると、配列内の各オブジェクトにそのメッセージが送信されます。

views配列にLogUnitオブジェクトが含まれていLogUnitて、メソッドを定義している場合compareWithUnit:、それは機能します。そうしないと、クラッシュします。

でハードコーディングされているため、この動作を変更する方法はありませんNSArray

ところで、ターゲットはオブジェクト (つまり、実行時に存在するエンティティ) であり、セレクターはオブジェクトに送信したメッセージの名前にすぎないため、セレクター定義にターゲットを含める方法はありません。

セレクターにクラス仕様を追加するという考えにも、同じ理由で欠陥があります。つまり、ターゲットはクラスではなくオブジェクトです。さらに、Obj-C オブジェクトにメッセージを送信するときは、言語の動的な性質のために、オブジェクトのクラスを無視して送信するため、どちらも役に立ちません。

于 2013-01-07T12:49:36.073 に答える
-1

次のような文字列からセレクターを作成することもできます。

SEL selector = NSSelectorFromString(@"myMethod:");
于 2013-01-07T12:51:01.783 に答える