2012-06-20 2 views
1

Справочная информация:Как ссылаться на контроллер вида из селектора UIPanGestureRecognizer в iOS?

У меня есть объект поляроида на основе MVC. Модель сохраняет метаданные фотографии и изображение. В представлении отображается имя и изображение фотографии (через UIView). Контроллер имеет доступ к модели и представления и координирует операции между ними (например, замирания в модели фото на вид.)

Моя цель:

Я хочу осуществить простым перетаскиванием-и- drop в моей программе, чтобы пользователь мог перетащить взгляд поляриста и viewcontroller в альбом.

Проблема:

Я могу добавить UIPanGestureRecognizer к мнению моего Polaroid в. Однако я не могу получить доступ к viewcontroller или model из метода 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 представления.

Кто-нибудь знает, как я мог это сделать? Или обойти это?

ответ

0

Предполагая, что вы не можете изменить код своего PolaroidViewController или PolaroidView. У вас есть альтернативы. Один из них использует ассоциирующие объекты.

В Objective-C вы можете вставлять свойства времени выполнения в объекты. Он поставляется с несколькими «gotcha», но если у вас нет контроля над представлением и контроллером, это может помочь.

Первый импорт objc/runtime.ч в источнике

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

Недавно я сделал аналогичный компонент. Вы не можете (насколько мне известно) напрямую получить контроллер вида view. Однако, если вы измените структуру объекта, который является объектом распознавателя жестов, вы можете поддерживать собственный поиск VC. Обычно я устанавливаю цель как контроллер вида, который сначала создает распознаватель жестов. Затем я добавляю к словарю с ключом в представлении, чтобы разрешить просмотр контроллера вида из обратного вызова. Трюк с использованием представления для словарного ключа заключается в том, чтобы «обернуть» его как NSValue с помощью [NSValue valueWithNonretainedObject: theView]

0

Я обычно делаю сенсорную логику обработки в контроллере представления или, по крайней мере, цель и передать соответствующую информацию на представление. Для меня это кажется более MVC и красиво обходит эту проблему.

Смежные вопросы