繁体   English   中英

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

[英]How to reference a view's controller from the UIPanGestureRecognizer's selector in iOS?

背景:

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

我的目标:

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

问题:

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

有谁知道我该怎么做? 还是解决它?

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

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

假设您无法更改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)
    //...    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM