从 View 与 ViewController 对话
Posted
技术标签:
【中文标题】从 View 与 ViewController 对话【英文标题】:Talking to ViewController from View 【发布时间】:2014-08-06 20:55:12 【问题描述】:我在子视图中设置了 GestureRecognizer 来检测双击。发生这种情况时,拥有的 ViewController 应该呈现一个新的 ViewController。这似乎需要从 View 到其 Controller 的反向指针。
现在这让我大吃一惊:糟糕的 MVC 等。但必须有一个适当的设计。检测 ViewController 中的双击,然后通过 event.view 值决定哪个子视图?不知何故,在子视图中使用 GestureRecognizer 似乎要好得多。这里的最佳实践是什么?
【问题讨论】:
委托模式是标准方法 ios: handling of UIGestureRecognisers in UI(Sub)Views的可能重复 为什么不直接使用 UIGestureRecognizer 的 addTarget:action: 方法并将您的第一个控制器设置为目标,而操作是设置和呈现您的第二个 viewController 的方法? 【参考方案1】:向视图添加一个委托协议,该协议可以在双击发生时进行报告,并使视图控制器符合该协议。
示例
MyView.h:
@protocol MyViewDelegate;
@interface MyView : UIView
@property (nonatomic, weak) id <MyViewDelegate> delegate;
// stuff here
@end
@protocol MyViewDelegate <NSObject>
@optional
-(void)myViewDidDoubleTap:(MyView *)myView;
@end
MyView.m:
-(void)doubleTap:(id)sender // your double tap method called by the gesture recognizer
if ([[self delegate] respondsToSelector:@selector(myViewDidDoubleTap:)])
[[self delegate] myViewDidDoubleTap:self];
然后在您的视图控制器标题(或类扩展,您的选择)中:
@interface MyViewController : UIViewController <MyViewDelegate>
以及在实现文件中初始化视图的位置:
MyView *myView = [[MyView alloc] init];
[myView setDelegate:self];
// do stuff here
最后添加委托方法:
-(void)myViewDidDoubleTap:(UIView *)myView
// show your view controller here
【讨论】:
这些是关于我的想法。我犹豫的原因是因为子视图向下几个级别,并且不是由控制器直接创建的,而是由其父视图创建的,由 its 超级视图等创建。所以我必须通过控制器的指针通过几个级别的初始化程序逐步向下,将其存储在从不使用它的视图中,以便他们可以在创建子视图时将其进一步向下传递,等等。尴尬。但我想事情就是这样。 你也可以让你的视图发布一个 NSNotification 并且感兴趣的对象可以订阅它以上是关于从 View 与 ViewController 对话的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AppDelegate 上的 TabBarController 获取 ViewController?
Swift如何取得View所属的ViewController
将数据从一个 ViewController 中的 UITextField 传递到另一个 View Controller 中的 UILabel