【问题标题】:Setting the delegate for a 2nd tier tableViewController presented in a popover为弹出窗口中显示的第二层 tableViewController 设置委托
【发布时间】:2012-03-19 16:49:03
【问题描述】:

我的应用程序启动到导航控制器。根视图控制器有一个按钮,该按钮创建一个带有 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 的代理并通过其中一个传递消息,到另一个...虽然这不正确,但我不禁要说,必须有一种更简单/更清洁的方法来做到这一点,而不是创建一个委托,其唯一目的是帮助其他东西设置它的委托!

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

【问题讨论】:

    标签: objective-c ios delegates uitableview uipopover


    【解决方案1】:

    你的想法大部分是正确的。正如您所说,您可以将主 ViewController 设置为第一级 TVC 的委托。然后,由于您的第一级TVC已经参考主视角控制器,您可以使用它在实例化它时设置第二级TVC的委托属性(选择表行时)。

    所以在您的第一级 TVC 中:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        SecondTVC *secondTVC = [[SecondTVC alloc] init];
        secondTVC.delegate = self.delegate;
        [self.navigationController pushViewController:secondTVC animated:YES];
    }
    

    【讨论】:

    • 谢谢,这是通过 segues/storyboard 完成的,所以我不得不将该代码放在 prepareForSegue 中,但这并没有设置委托,并给我以下警告:分配给 'id' 来自不兼容类型 'id'
    • 要删除警告,您可以尝试投射:secondTVC.delegate = (id<secondTVCDelegate>)self.delegate;
    【解决方案2】:

    我不确定这是否是最好的方法,但它似乎可以正常工作并且可以很好地设置委托。我已将以下内容放在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2022-12-14
      相关资源
      最近更新 更多