2

ビューの「削除」ボタンが押されます。ビューは、ボタンの押下を処理するビュー コントローラーに属します。ただし、そのビュー コントローラーはコンテナー ビュー コントローラーの子であるため、削除が要求されたというメッセージをデリゲートに送信し、削除する必要があるオブジェクトを含めます。

UIActionSheetデリゲート (親ビュー コントローラー) は通知を受け取り、削除を確認するためにを提示します。また、自身をそのアクション シートのデリゲートにします。

ユーザーが削除を確認すると、親ビュー コントローラーはオブジェクトを削除する準備が整います。でこれを行う必要があることを除いてactionSheet:didDismissWithButtonIndex:。その時点までに、どのオブジェクトが子ビュー コントローラーから渡されたかはわかりません。

オブジェクトをアラート シートに添付して、却下アクションが発生したときにそのオブジェクトを取得できるようにする方法はありますか?

4

3 に答える 3

5

Objective-C 2.0 ランタイムは関連付けられたオブジェクトをサポートしています。この API を使用すると、キーと値のメソッドを使用してオブジェクトを相互に関連付けることができます。例:

id someObject = // however you obtain it
objc_setAssociatedObject(theActionSheet, "AssociatedDelegateObject", someObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

// later try to get the object:
id someObject = objc_getAssociatedObject(theActionSheet, "AssociatedDelegateObject");
// process the associated object, then release it:
objc_removeAssociatedObjects(theAlertSheet);

編集:アラートシートを管理する同じクラス/オブジェクトが委任も気にするため、大砲を使用して鳥を撃ち、ランタイム関数を使用する必要はないようです。そのため、一時的にインスタンスに割り当てることができます変数。ただし、このアプローチは、後でオブジェクト モデルがより複雑になったときに拡張しやすい場合があります。

于 2012-10-06T19:32:57.480 に答える
2

私の ActionSheetDelegate クラスを使用して、メソッドの代わりに動作するブロックを作成できますactionSheet:clickedButtonAtIndex:。ブロックはアクション シートの作成と同じコンテキストで作成されるため、削除するオブジェクトをキャプチャできます。

ActionSheetDelegate * delegate;
delegate = [ActionSheetDelegate delegateWithHandler:
    ^( UIActionSheet * sheet, NSInteger idx ){
        if( idx == [sheet destructiveButtonIndex] ){
            [self destroyObject:obj];
        }
        // Cancel button "falls through" to no action
}];

Associated Objects ランタイム機能を使用して、オブジェクトを別の任意のオブジェクトに「関連付ける」こともできます。本質的に、これによりいつでも任意のインスタンスに ivar を追加できます。

// Set:
objc_setAssociatedObject(sheet, &key, objectToDestroy, OBJC_ASSOCIATION_RETAIN);

// Retrieve:
id objectToDestroy = objc_getAssociatedObject(sheet, &key);

keyこれには、どこかに変数が必要です。ドキュメントは、static charここで行ったように、アドレスが使用されるファイルレベルの . ただし、設定と取得の間で変化しない値はすべて機能します。

于 2012-10-06T19:33:09.650 に答える
2

これを行うには多くの方法があります。

最も簡単なのは、削除するオブジェクトを保持するインスタンス変数を親ビュー コントローラーに与えることです。はUIActionSheet他のユーザーの操作をブロックするため、最初のオブジェクトの削除が保留されている間、ユーザーが 2 番目のオブジェクトの削除を要求することはできません。

最善の方法は、アクション シートをまったく表示せず、削除を実行してユーザーに「元に戻す」ボタンを表示することです。

関連オブジェクトを使用できます (H2CO3 の回答を参照)。

アラート ビューのボタン ハンドラーとしてブロックを設定できるラッパーを使用できます (Josh Caswell の回答または私自身の を参照してくださいBlockActionSheet)。

UIActionSheet のサブクラスを作成し、削除保留中のオブジェクトを保持するプロパティを与えることができます。

于 2012-10-06T19:36:02.143 に答える