ios,从视图中获取指向控制器的指针

我正在尝试创建一个ios UI元素,我可以将屏幕上的项目拖到tableView上,tableView将添加相应的元素。 我正在使用hitTest函数来识别我正在拖动元素的视图,并且工作正常。 我的问题是,当我需要指向tableView的控制器的指针时,hitTest会给我一个指向tableView的指针,以便我可以调用“添加新项”function。 如何从指针到视图转到指向该视图控制器的指针?

视图控制器是响应器链的一部分。 因此,从任何视图,只需继续调用nextResponder直到您到达一个视图控制器的对象。

 UIResponder* r = someView; while (![r isKindOfClass: [UIViewController class]]) r = [r nextResponder]; UIViewController* vc = (UIViewController*)r; 

当您需要从视图中调用视图控制器中的方法时,另一个非常酷的技巧是使用零目标操作 。 这是因为没有针对性的行动走在响应者链上寻找处理行动的人。 例如,这里的代码将按钮的动作设置为nil-targeted:

 [b addTarget:nil action:@selector(doButton:) forControlEvents:UIControlEventTouchUpInside]; 

如果视图控制器实现了doButton: ,则在点击此按钮时将调用它。

你不应该这样。 想要表明您在错误的地方管理拖动。

据推测,您有一个容器视图控制器,其视图具有多个子视图(每个子视图都有一个子视图控制器),表视图就是其中之一。

在这种情况下,使容器视图控制器成为附加到要拖动的项目的拖动手势的目标。 当拖动手势触发时,控制器可以根据需要重新定位视图,并且还可以访问表控制器及其视图(放置目标)。

通过这种方式,您不需要滥用视图和控制器之间的任何现有连接来尝试重新调整它们的用途。

您不应该从视图中获取指向viewController的指针。 这将打破MVC,因为视图不应该知道它的控制器,但控制器应该知道它负责哪个视图。

它可以做但显然是不好的做法: 如何在iPhone SDK中获得UIView的superView的UIViewController?

好吧,您可以使用dataSource和/或委托并假设(或假设并validation)它们是您想要的控制器。 一个稍微好一点的解决方案是子类化您的UITableView并添加一个引用视图控制器的属性。

正如Anindya指出的那样,你不应该在视图中持有对视图控制器的引用。 一个更好的方法完全是用于处理drags的UI元素具有委托属性(设置为表视图的控制器),具有处理拖动结果的特定方法。 您正在拖拽事物的视图不应该真正了解您要拖动它们的视图,通过委托方法处理它。

您通常可以使用:tableView.dataSource或tableView.delegate