1

バックグラウンド:

MVC ベースのポラロイド オブジェクトがあります。モデルは、写真のメタデータと画像を保持します。ビューには、写真の名前と画像が表示されます (UIView 経由)。コントローラーはモデルとビューにアクセスし、それらの間の操作を調整します (例: ビュー上のモデル写真のフェードイン)

私の目的:

プログラムに簡単なドラッグ アンド ドロップ機能を実装して、ユーザーがポラロイドのビューとビューコントローラーをアルバムにドラッグできるようにしたいと考えています。

問題:

ポラロイドのビューに UIPanGestureRecognizer を追加できました。ただし、polaroidPanned メソッドからビューコントローラーまたはモデルにアクセスできません。

UIPanGestureRecognizer の追加:

 UIPanGestureRecognizer *panRecogniser = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(polaroidPanned:)];
    [polaroidController.polaroidView addGestureRecognizer:panRecogniser];

UIPanGestureRecognizer ハンドラは次のとおりです。

    - (void) polaroidPanned: (UIPanGestureRecognizer *) panGesture
{
    CGPoint touchLocation = [panGesture locationInView:self.view];

    //While being dragged
    if ([panGesture state] == UIGestureRecognizerStateBegan || [panGesture state] == UIGestureRecognizerStateChanged) 
    {
        //update the album view to the touch location
        [panGesture view].center = touchLocation;
    }
    else  if ([panGesture state] == UIGestureRecognizerStateEnded && isOntopOfAlbum)
    {
        //HERE I WANT TO PASS THE VIEW CONTROLLER OF THE [panGesture view] to my album
        [album addPolaroidViewController: ????]

    }
}

ビューを渡すことはできますが、ビューの ViewController を参照できないようです。

どうすればこれを達成できるか知っている人はいますか? またはそれを回避しますか?

4

3 に答える 3

0

PolaroidViewController または PolaroidView のコードを変更できないと仮定します。代替手段があります。それらの 1 つは関連付けオブジェクトを使用しています。

Objective-C では、ランタイム プロパティをオブジェクトに挿入できます。いくつかの「落とし穴」が付属していますが、ビューとコントローラーを制御できない場合は、これが役立つ場合があります。

最初にソースに objc/runtime.h をインポートします

#import <objc/runtime.h>

関連オブジェクトを取得するために使用するキーを宣言します

const NSString* kViewController = @"panGestureViewController";    

次に、UIPanGestureRecognizer を作成するときに、次のようにオブジェクトを関連付けます。

// Create
UIPanGestureRecognizer *panRecogniser = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(polaroidPanned:)];
[polaroidController.polaroidView addGestureRecognizer:panRecogniser];
// Associate
objc_setAssociatedObject(panRecogniser, &kViewController, polaroidController,OBJC_ASSOCIATION_ASSIGN);

ハンドラーで関連オブジェクトを取得するには

- (void) polaroidPanned:(UIPanGestureRecognizer *)panGesture
{
    PolaroidViewController* viewController = ((NSNumber*)objc_getAssociatedObject(panGesture, &kViewController)
    //...    
}
于 2012-06-20T04:23:29.867 に答える
0

通常、ビュー コントローラーでタッチ処理ロジックを実行するか、少なくともビュー コントローラーをターゲットとして機能させ、関連情報をビューに渡します。それは私にはMVCのように見え、この問題をうまく回避しています。

于 2012-06-20T04:17:47.600 に答える
0

最近、同様のコンポーネントを作成しました。(私の知る限り)ビューのView Controllerを直接取得することはできません。ただし、どのオブジェクトがジェスチャ認識エンジンのターゲットであるかの構造を変更すると、VC の独自のルックアップをサポートできます。通常、最初にジェスチャ レコグナイザーを作成するビュー コントローラーとしてターゲットを設定します。次に、ビューをキーにしたディクショナリに追加して、コールバックからビュー コントローラを検索できるようにします。ディクショナリ キーにビューを使用する秘訣は、 [NSValue valueWithNonretainedObject:theView] を使用して NSValue として「ラップ」することです。

于 2012-06-20T04:00:59.283 に答える