来自NsObject子类的当前视图控制器



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;

或类似的东西(只是猜测您的数据结构,那里)可能会更有意义?

最新更新