2012-06-20 1 views
1

배경 :iOS의 UIPanGestureRecognizer의 선택자에서보기의 컨트롤러를 참조하는 방법은 무엇입니까?

내가 MVC 기반 폴라로이드 개체가 있습니다. 모델은 사진의 메타 데이터 및 이미지를 유지합니다. 보기에는 사진의 이름과 이미지가 UIView를 통해 표시됩니다. 컨트롤러는 모델과 뷰에 대한 액세스 권한을 가지고 있으며, 그들 사이에 (보기에 예를 들어, 페이드의 모델 사진.)

내 목표 작업을 조정 : 제가 구현하려는

간단한 드래그 앤를 드롭 기능을 사용하여 사용자가 polarid의 뷰를 드래그하여 뷰 컨트롤러을 앨범으로 드래그 할 수 있습니다.

문제 : 내 폴라로이드의보기로 UIPanGestureRecognizer을 추가 할 수있어

. 그러나, 나는 polaroidPanned 메서드에서 viewcontroller 또는 모델에 액세스 할 수 없습니다. 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를 참조 할 수없는 것.

아무도 내가 이것을 수행 할 수있는 방법을 알고 있습니까? 아니면 해결할 수 있을까요?

답변

0

PolaroidViewController 또는 PolaroidView의 코드를 변경할 수 없다고 가정합니다. 당신은 대안이 있습니다. 그들 중 하나는 연관 객체를 사용하고 있습니다.

Objective-C에서 런타임 속성을 개체에 삽입 할 수 있습니다. 그것은 몇 가지 "잡았다"하지만 당신이보기와 컨트롤러를 제어 할 수 없다면 도움이 될 것입니다.

먼저 import objc/runtime.당신이 당신의 UIPanGestureRecognizer을 만들 때 소스의 시간은

#import <objc/runtime.h> 

당신과 같이 객체를 연결

const NSString* kViewController = @"panGestureViewController";  

그런 다음 연관 객체를 얻기 위해 사용되는 키를 선언 :

// 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) 
    //...  
} 
0

나는 최근에 비슷한 구성 요소를 만들었습니다. 내가 아는 한 뷰의 뷰 컨트롤러를 직접 가져올 수는 없습니다. 그러나 제스추어 인식기의 대상이되는 개체의 구조를 수정하면 자신의 VC 조회를 지원할 수 있습니다. 일반적으로 제스처 인식기를 처음 생성하는보기 컨트롤러로 대상을 설정합니다. 그런 다음 콜백에서보기 컨트롤러를 조회 할 수 있도록보기에 키가있는 사전에 추가합니다. 사전 키에 대한보기를 사용하는 방법은 [NSValue valueWithNonretainedObject : theView]로 NSValue로 '감싸는 것'입니다.

0

저는 일반적으로보기 컨트롤러에서 논리를 처리하거나 적어도보기 컨트롤러가 대상을 찾고 관련 정보를보기로 전달합니다. 그것은 나에게 MVC가 더 좋고이 문제를 잘 해결해 준다.