![](/img/trans.png)
[英]how to access second_view_controller's scroll view from first_view_controller in iOS
[英]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.