如何从iOS中的UITapGestureRecognizer选择器引用视图控制器?

时间:2012-06-20 03:49:04

标签: ios uipangesturerecognizer

背景

我有一个基于MVC的宝丽来对象。该模型保留照片的元数据和图像。视图显示照片的名称和图像(通过UIView)。控制器可以访问模型和视图,并协调它们之间的操作(例如,视图中的淡入模型照片)

我的目标:

我想在我的程序中实现一个简单的拖放功能,以便用户可以将一个极地视图和 viewcontroller 拖到相册中。

问题:

我可以将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。

有谁知道我怎么能做到这一点?或者解决它?

3 个答案:

答案 0 :(得分:0)

我最近做过类似的组件。您不能(据我所知)直接获取视图的视图控制器。但是,如果修改哪个对象的结构是手势识别器的目标,则可以支持自己的VC查找。通常,我将目标设置为首先创建手势识别器的视图控制器。然后我添加到视图上键入的字典,以允许从回调中查找视图控制器。使用视图进行字典键的技巧是使用[NSValue valueWithNonretainedObject:theView]将其“包装”为NSValue

答案 1 :(得分:0)

我通常在视图控制器中执行触摸处理逻辑,或者至少让视图控制器充当目标并将相关信息传递给视图。对我来说这似乎更像是MVC并且很好地绕过了这个问题。

答案 2 :(得分:0)

假设您无法更改PolaroidViewController或PolaroidView的代码。你有其他选择。其中一个是使用关联对象。

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