【问题标题】:Present view controller from NSObject subclass从 NSObject 子类呈现视图控制器
【发布时间】: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


【解决方案1】:

我可能会选择选项 2。这意味着您的委托和数据源不需要保存对视图控制器的引用,以便它可以呈现另一个视图控制器。这也是一种额外的责任分离 - 您的委托/数据源仅负责管理 tableview 的数据,在用户选择某些内容时执行 UI 功能/导航。

通过实现委托,您的YBMatchesTableViewDelegateAndDataSource 仍然与数据有关。它只是报告用户何时选择了一条数据。然后,您的视图控制器可以决定如何管理视图来处理它。

不过,我建议重命名您的 rowTapped 方法。我会使其更具描述性,并且根据您的设置,您可能希望传递一个参数,以便您的视图控制器知道它需要显示什么内容。比如:

- (void)userDidSelectMatch:(YBMatch *)match;

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

【讨论】:

  • 跟我想的完全一样。 rowTapped 方法仅用于示例目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2012-03-16
相关资源
最近更新 更多