1

背景:

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

我的目标:

我想在我的程序中实现一个简单的拖放功能,以便用户可以将 Polarid 的视图和视图控制器拖放相册中。

问题:

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

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

于 2012-06-20T04:00:59.283 回答
0

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

于 2012-06-20T04:17:47.600 回答
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)
    //...    
}
于 2012-06-20T04:23:29.867 回答