从 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 对话的主要内容,如果未能解决你的问题,请参考以下文章

从View上跳转到ViewController

如何从 AppDelegate 上的 TabBarController 获取 ViewController?

iOS view和viewController的生命周期

ViewController加载顺序与self.view

Swift如何取得View所属的ViewController

将数据从一个 ViewController 中的 UITextField 传递到另一个 View Controller 中的 UILabel