我的应用程序启动到导航控制器。根视图控制器有一个按钮,用于创建一个带有tableViewController的弹出窗口,允许用户选择一个单元格,该单元格使用通过“preperaForSegue”创建弹出窗口时设置的TableViewController的委托,与根视图控制器进行通信。将相关的ViewController推送到导航堆栈。
代表设置如下:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"planningSegue"])
{
[segue.destinationViewController setDelegate:self];
}
}
这样称呼的方法:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[self delegate] gotoPlanningToPage:[tableView cellForRowAtIndexPath:indexPath].textLabel.text];
}
这很好用。
我在根视图控制器上有另一个按钮,它带有一个不同的popover和一个不同的tableViewController,这个按钮有一个选项列表,每个选项在被选中时会将另一个表视图转换到堆栈上(仍然在popover中) )包含项目列表。选择其中一个需要与主ViewController(最初创建弹出窗口的那个)进行通信,将新视图推送到其导航堆栈,类似于第一个按钮的操作方式。
问题:我如何/在哪里设置第二个tableViewController的委托?
创建弹出窗口时我无法创建它,因为第二个tableViewController仅在第一个TVC中选择了一个单元格时才会出现。但是我无法弄清楚当第二个TVC被调用时如何从第一个TVC设置它,因为我没有看到能够与popover的创建者(父母?)进行通信的方法。
我唯一想到的是将主ViewController设置为popover中第一级TVC的委托,然后将该TVC设置为第二级TVC的委托并将消息传回一个,到了另一个...虽然这不恰到好处,但我不得不说,必须有一个更简单/更清洁的方法,而不是创建一个委托,其唯一目的是帮助其他人设置其代表!
我对这一切仍然相对较新,如果我没有意义,或者我错过了一些明显的东西,那么道歉!
答案 0 :(得分:0)
你的想法大多是正确的。您可以将主ViewController设置为第一级TVC的委托。然后,由于你的第一级TVC已经引用了主viewController,你可以使用它来设置第二级TVC的委托属性(当你选择表行时)。
所以在你的第一级TVC:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
SecondTVC *secondTVC = [[SecondTVC alloc] init];
secondTVC.delegate = self.delegate;
[self.navigationController pushViewController:secondTVC animated:YES];
}
答案 1 :(得分:0)
这是否是最好的方式,我不确定,但它似乎正在工作并设置委托就好了。我已经在popovers第一个tableViewController
中将以下内容放在prepareForSegue中-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell *)sender
{
SecondLevelTVC *secondLevelTVC = (SecondLevelTVC *)segue.destinationViewController;
UINavigationController *mainNav = (UINavigationController *)self.view.window.rootViewController;
RootAppViewController *rootAppViewController = (RootAppViewController *)mainNav.topViewController;
secondLevelTVC.delegate = rootAppViewController;
}