我在UITableViewController
内有一个UIViewController
。虽然这个表视图控制器是唯一涉及的,但是当用户点击一行时,它正在推动视图。但是,自从我将它移动到UIViewController
中包含的两个中的一个之后,行的突然显然什么也没做。
我tried searching around并且我不是第一个遇到这个问题的人,但是没有一个答案符合我的情况,或者问题没有合适的答案。这个链接是我找到的最接近的,但我没有使用故事板 - 我正在使用单独的XIB。
那么如何在viewcontroller中从viewcontroller推送新视图?
回顾一下:
这就是我所拥有的,并且将用户带到新屏幕时效果很好!
// Normal table behavior, as illustrated by [another question][2].
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
SomeView *detailViewController = [[SomeView alloc] initWithNibName:@"SomeView" bundle:nil];
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
}
现在我将viewcontroller作为视图中的属性 - 上面的代码位于tableviewcontroller的文件中而不是“main”视图中,不会导致出现新的屏幕了!
感谢您的评论!这里有一些代码来澄清我的场景。
控制器内的控制器。这是我用来测试概念的测试项目中的文件。在这种情况下,我在tableview控制器中有一个tableview控制器。
@interface SimpleTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
// This is the controller within the controller
@property IBOutlet SecondTableViewController *secondTableController;
@property IBOutlet UITableView *secondTable;
我的SecondTableViewController
有这个有趣的地方。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
UIViewController *detailViewController = [[UIViewController alloc] initWithNibName:@"SimpleNonTableViewController" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[manualViewControllerParent.navigationController pushViewController:detailViewController animated:YES];
}
用户与之交互的视图已连接到SimpleTableViewController
。这样,SecondTableViewController
就在“SimpleTableViewController
内”。如果您想了解更多详情,请随时发表评论!
我把我的测试/概念项目放在github上。 https://github.com/hyliandanny/TableViewCeption
答案 0 :(得分:3)
您需要使用自定义容器控制器来执行您想要的操作。如果您使用故事板,这将是最简单的,但您也可以使用xibs在代码中执行此操作。外部控制器应该是UIViewController,而不是表视图控制器。你可以这样做(在外部控制器中):
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIViewController *detailViewController = [[UIViewController alloc] initWithNibName:@"SimpleNonTableViewController" bundle:nil];
[self addChildViewController:detailViewController];
detailViewController.view.frame = set the frame to what you want;
[self.view addSubview:detailViewController.view];
[detailViewController didMoveToParentViewController:self];
}
您应该阅读Apple的自定义容器控制器文档。
答案 1 :(得分:0)
您需要确保:
UITableView
代表已连接到您的控制器。否则它就不会打电话给didSelectRow
。您可以在xib或viewDidLoad方法中执行此操作。我还认为你的意思是你UITableView
内有UIViewController
。 UITableView
仅是视图,而UITableViewController
是控制器。你不能在另一个控制器内部安装一个控制器。