如果 ViewController 包含作为根的 TableView,如何将 ViewController 添加到导航控制器? [关闭]

Posted

技术标签:

【中文标题】如果 ViewController 包含作为根的 TableView,如何将 ViewController 添加到导航控制器? [关闭]【英文标题】:How to add a ViewController to a Navigation Controller, if it contains a TableView as root? [closed] 【发布时间】:2011-01-25 03:01:08 【问题描述】:

我正在尝试将 UIViewController (AddProjectViewController) 添加到导航控制器 (navigationController),该控制器将 tableView 设置为 root,但它不起作用。

这就是我设置文件的方式:http://d.pr/y8rt

代码在ProjectsController.m - 请帮忙:(

【问题讨论】:

应该在点击+的时候添加,这样我就可以查看添加项目的视图了。 你想从底部推入还是滑动视图控制器? (我建议以模态方式呈现它(从底部滑入),因为这在添加内容和点击“完成”返回列表的活动方面更有意义) 【参考方案1】:

好的,那我先给你解释一下你做错了什么:

// You're not allocating the view here.
AddProjectViewController *nextController = addProjectViewController;
// When allocated correctly above, you can simple push the new controller into view
[self.navigationController pushViewController: (UIViewController *)addProjectViewController animated:YES];

被推送的视图控制器将自动继承超级的(推送它的视图控制器)导航栏(这意味着您可以在子视图控制器中调用 self.navigationController,因为 UINavigationController 只是 UIViewController 的子类(因此也是UITableViewController)。

这是你需要做的:

// Allocate AddProjectViewController
AddProjectViewController *addProjectViewController = [[AddProjectViewController alloc] init];
// Adds the above view controller to the stack and pushes it into view
[self.navigationController pushViewController:addProjectViewController animated:YES];
// We can release it again, because it's retained (and autoreleases in the stack). You can also choose to autorelease it when you allocate it in the first line of code, but make sure you don't call release on it then!
[addProjectViewController release];

但是,对于您要执行的操作,以模态方式呈现视图控制器会更好,这意味着您必须将其保存在导航控制器中。方法如下:

// Allocate AddProjectViewController
AddProjectViewController *addProjectViewController = [[AddProjectViewController alloc] init];
// Create a navigation controller
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addProjectViewController];
// Release the view controller that's now being retained by the navigation controller
[addProjectViewController release];
// Adds the above view controller to the stack and present it modally (slide from bottom)
[self presentModalViewController:navigationController animated:YES];
// Release the navigation controller since it's being retained in the navigation stack
[navigationController release];

请注意,您需要在 AddProjectViewController 类中创建 UIBarButtonItems。

我已经更新了你的代码并上传到这里:http://dl.dropbox.com/u/5445727/Zum.zip

希望对您有所帮助,您需要查看这里的 cmets,我没有将它们转移到您的项目中。祝你好运:)

【讨论】:

非常感谢!我正在检查您发送的整个代码,再次感谢您! 哦,是的,现在说得通了!我也会使用模态视图,它更有意义。谢谢你一百万! 如果您能提供帮助,我还有一个问题 - 我现在将如何从 AddProjectViewController 访问 tableView?我在那里添加了 addProject 方法,但是当我尝试调用时:[super.tableView reloadData];它不起作用。此外,当我评论这一特定行时,应用程序崩溃并且数据不会被保存。 :( 我把文件放在这里,请再次检查 - (void)addProject:(id)sender in AddProjectViewController 这里:d.pr/5INn 您有四个选择: 1) 为 ProjectsController 继承的 AddProjectsViewController 创建一个委托。 2) 使用 NSNotifications 3) 在 vi​​ewWillAppear 中的 tableView 上调用 reloadData 4) 由于您使用的是核心数据,实际上有一个委托方法会在数据更改(删除记录等)时触发。在您的 ProjectsController 中添加此委托方法并在此方法中重新加载 tableview。就个人而言,我会选择选项#4,因为你已经设置了所有的 CD 东西,你只需要添加一个免费的委托方法,你就完成了!

以上是关于如果 ViewController 包含作为根的 TableView,如何将 ViewController 添加到导航控制器? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

ViewController 作为子视图

多个 ViewController - 最佳方法

有条件地在选项卡栏项后面选择viewcontroller

UILabel 中的按钮/链接以切换到另一个 ViewController

bzoj3306: 树(dfs序+倍增+线段树)

域驱动设计:如何访问聚合根的子节点