0

我的应用程序启动到导航控制器。根视图控制器有一个按钮,该按钮创建一个带有 tableViewController 的弹出框,允许用户选择一个单元格,该单元格使用 TableViewController 的委托在通过“preperaForSegue”创建弹出框时设置,与根视图控制器通信并将相关的 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];
}

这很好用。

我在根视图控制器上有另一个按钮,它使用不同的 tableViewController 调出不同的弹出框,这个按钮有一个选项列表,每个选项在选择时都会将另一个表视图放到堆栈上(仍在弹出框内),其中包含一个物品清单。选择其中一个需要与主 ViewController(最初创建弹出框的那个)进行通信,以将新视图推送到其导航堆栈中,类似于第一个按钮的操作方式。

问题:如何/在哪里为第二个 tableViewController 设置委托?

创建弹出框时我无法创建它,因为第二个 tableViewController 仅在第一个 TVC 中选择一个单元格时才存在。但是当第二个 TVC 被调用时,我无法弄清楚如何从第一个 TVC 设置它,因为我看不到能够与弹出框的创建者(父级?)进行通信的方法。

我唯一的想法是将主 ViewController 设置为弹出窗口中第一级 TVC 的代表,然后将该 TVC 设置为第二级 TVC 的代表,并通过一个将消息传递回另一个......虽然这并不正确,但我不禁想到必须有一种更简单/更清洁的方式来做这件事,而不是创建一个委托,其唯一目的是帮助其他东西设置它的委托!

我对这一切还比较陌生,所以如果我没有说清楚或者我错过了一些明显的东西,请道歉!

4

2 回答 2

0

Your idea is mostly correct. You can set the main ViewController to be a delegate for the first level TVC as you say. Then, since your first level TVC already has a reference to the main viewController you can use that to set the second level TVC's delegate property at the time you instantiate it (when the table row is selected).

So in your first level TVC:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SecondTVC *secondTVC = [[SecondTVC alloc] init];
    secondTVC.delegate = self.delegate;
    [self.navigationController pushViewController:secondTVC animated:YES];
}
于 2012-03-19T17:26:57.433 回答
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;
}
于 2012-03-20T11:55:39.393 回答