在 UITableView 中选择一行时显示新视图

Posted

技术标签:

【中文标题】在 UITableView 中选择一行时显示新视图【英文标题】:Displaying a new view when selecting a row in a UITableView 【发布时间】:2009-06-06 00:44:49 【问题描述】:

我有一个具有多个视图的应用程序。我可以单击不同的按钮来选择不同的视图,其中一个显示一个表格。当我选择该行上的一个单元格时,我想显示一个新视图。我看到一条日志行表明该视图已加载,但屏幕没有改变。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
  UITableViewCell *targetCustomCell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];

  [tableView deselectRowAtIndexPath:indexPath animated:YES];
  NSLog(@"in didSelectRowAtIndexPath");

  ItemDetailsViewController *detailsController = [[ItemDetailsViewController alloc] initWithNibName:@"ItemDetailsView" bundle:nil];
  [self.navigationController pushViewController:detailsController animated:YES];
  [self.window addSubview:[detailsController view]];
  [detailsController release];
  detailsController = nil;

在ItemDetailsViewController中,我有

- (void)viewDidLoad 
  [super viewDidLoad];
  NSLog(@"in ItemDetailsViewController.viewDidLoad ");

我看到两条日志行,但屏幕没有改变。为什么观点不变?有没有其他方法可以改变视图?

【问题讨论】:

【参考方案1】:

如果您尝试使用 [self presentModalViewController: detailsController animated:YES] 而不是导航控制器的 pushViewController 来展示您的详细信息控制器,会发生什么?此外,不需要将视图添加到窗口。推送视图控制器就足够了。

尝试添加 NSLog([self.navigationController description]) 并查看 self.navigationController 是否为 nil。 (如果您当前的控制器不是 UINavigationController 的子控制器,则可能会发生)。将消息传递给 nil 对象只是默默地失败,所以很有可能就是问题所在。

希望有帮助!

编辑:通常不需要继承 UINavigationController。在 Apple 的文档中查看此页面:Apple Docs: Using Navigation Controllers 它很好地解释了设置。如果您在应用程序委托中以编程方式创建“根”视图控制器,您需要执行以下操作:

// set up main view controller
DrawingBrowserController *controller = [[DrawingBrowserController alloc] init];

// create a navigation controller that "wraps" the controller
navigationController = [[UINavigationController alloc] initWithRootViewController: controller];

[controller release];

// Add the navigation controller's view to the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];

基本上,您将根视图控制器“包装”在导航控制器中。如果您使用的是 Interface Builder,您也可以在那里进行设置。

【讨论】:

使用 presentModalViewController 有效 - 基于上一个问题 (***.com/questions/948874) 我有一个扩展 UIViewController 的控制器,而不是 UINavigationController。我必须创建另一个控制器,还是应该将 UINavigationController 添加到应用程序委托并从那里访问它?【参考方案2】:

你确定你的导航控制器是你窗口的根视图吗? 你通常应该在applicationDidFinishLaunching 方法中这样做:

[window addSubview:navigationController.view];    
[window makeKeyAndVisible];

此外,您应该删除[self.window addSubview:[detailsController view]];,因为它不是必需的。

【讨论】:

以上是关于在 UITableView 中选择一行时显示新视图的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器之间传递行选择

移动到显示 UITableView 的弹出窗口中的下一个视图

关闭模式视图时如何在 UITableView 中显示数据

在表格视图中选择新行时如何取消选择选定的行?

为 UITableView 的每一行推送不同的 UIView

呈现另一个视图控制器将 UITableView 滚动到顶部