【发布时间】:2014-01-26 21:31:20
【问题描述】:
我有一个 UITableView,其委托和数据源位于不同的文件中。当点击一行时,tableView:didSelectRowAtIndexPath: 中应该将一个新的视图控制器推送到堆栈上。由于 NSObject 文件(包含 UITableView 委托和数据源)没有 presentViewController:animated:completion: 我无法推送新的视图控制器。
我想有两种方法可以解决这个问题。
选项 1:
在 NSObject 文件中添加 tableview 的视图控制器 (RootViewController) 的属性,并在初始化对象时将该属性设置为等于视图控制器。这样我就可以在tableView:didSelectRowAtIndexPath:
[self.rootVC presentViewController:detailVC animated:YES completion:nil];
选项 2:
我还可以在 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并将tableview 的委托和数据源放入其中。
两者都说它不在视图层次结构中。 Warning: Attempt to present <DetailViewController 0x109123ff0> on <RootViewController: 0x10912aef0> whose view is not in the window hierarchy!
你更喜欢哪一个?或者我应该绝对不使用哪一个?我倾向于选择委托,因为第一个委托给了我另一个属性/对象。
【问题讨论】:
-
你能扩展选项 2 吗?我认为这可能是最好的选择,但我想更清楚您打算如何做到这一点。
-
如何将表格视图显示在屏幕上?您是否为此使用控制器,即一种 UIViewController?这也是负责呈现新视图控制器的对象。
-
不,只是以编程方式创建一个 UITableView。
标签: ios objective-c