i有一个uitableview,其委托和数据源在其他文件中。敲击行时,在tableView:didSelectRowAtIndexPath:
中,应将新视图控制器推入堆栈。由于NSObject文件(包含UITATIONVIEW委托和数据源)没有presentViewController:animated:completion:
,因此我无法推动新的视图控制器。
我认为有两种方法可以解决此问题。
选项1:
在初始化对象时,将表格视图控制器(RootViewController
)的属性添加到nsobject文件中,并设置该属性等于视图控制器。这样我就可以在tableView:didSelectRowAtIndexPath:
[self.rootVC presentViewController:detailVC animated:YES completion:nil];
选项2:
i还可以将一个委托书添加到NSOBject文件中,该文件具有RootViewController
中更改视图控制器的逻辑。
@protocol YBMatchesTableViewDelegateAndDataSourceDelegate
@optional
-(void)rowTapped;
@end
@property(nonatomic,assign)id delegate;
在tableView:didSelectRowAtIndexPath:
[self.delegate rowTapped];
中。最后,在rootviewController中。
-(void)rowTapped {
DetailViewController *detailVC = [[DetailViewController alloc] init];
[self presentViewController:detailVC animated:YES completion:nil];
}
什么不起作用:
-
[[RootViewController new] presentViewController:detailVC animated:YES completion:nil];
- 子分类
RootViewController
并将桌面的委托和数据源放在其中。
两者都说它不在视图层次结构中。Warning: Attempt to present <DetailViewController 0x109123ff0> on <RootViewController: 0x10912aef0> whose view is not in the window hierarchy!
您想要哪一个?还是我绝对应该使用哪一个?使用?我倾向于参加代表,因为第一个使我得到了另一个属性/对象。
我可能会选择选项2 。这意味着您的委托和数据源无需保留对ViewController的引用,以便它可以呈现另一个ViewController。这也是一个额外的责任 - 您的代表/数据源仅负责管理TableView的数据,不是在用户选择某些东西时执行UI功能/导航。
通过实施委托,您的YBMatchesTableViewDelegateAndDataSource
仍然涉及 data 。它只需报告用户选择一块数据时。然后,您的ViewController可以决定如何管理视图来处理。
不过,我建议重命名您的rowTapped
方法。我会使它更具描述性,并且根据您的设置,您可能需要传递参数,以便您的ViewController知道需要显示哪些内容。类似:
- (void)userDidSelectMatch:(YBMatch *)match;
或类似的东西(只是猜测您的数据结构,那里)可能会更有意义?