【问题标题】:Passing value using delegate is not working使用委托传递值不起作用
【发布时间】:2013-04-07 08:51:22
【问题描述】:

RootViewController 中,我有一个按钮,单击该按钮会使self.navigationController 推送到CategoryViewController

然后,在CategoryViewController 中,单击一个单元格推送到 SubCatsViewController。当我选择了一个单元格时,它应该将CategoryViewControllerSubCatsViewController 发送回RootViewController

但是该怎么做呢?

如果我使用dismissViewControllerAnimated,它只会关闭SubCatsViewController,而不是CategoryViewController。我在SubCatsViewController 中编写了一个委托,因此我可以从SubCatsViewController 中获取选定的值,并且在RootViewController 中我符合这个委托协议,以获得我想要的值。

但是,我无法使用我编写的委托获取值。

- (void)chooseCat:(BButton *)sender
{

    UIStoryboard *storyboard = [UIStoryboard 
    storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    CategoryViewController *cat = 
    [storyboard instantiateViewControllerWithIdentifier:@"Cats"];
    SubCatsViewController *sub = 
    [storyboard instantiateViewControllerWithIdentifier:@"SubCats"];
    sub.delegate = self; //correct way?
    [self.navigationController pushViewController:cat animated:YES];
}

CategoryViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath
{
    UIStoryboard *storeboard = 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    SubCatsViewController *sub = 
    [storeboard instantiateViewControllerWithIdentifier:@"SubCats"];
    sub.subCats = 
    [[self.cats objectAtIndex:indexPath.row] objectForKey:@"subcat"];
    [self.navigationController pushViewController:sub animated:YES];
}
SubCatsViewController.h

@protocol SubCatsDelegate <NSObject>

- (void)didSelectSubCats:(SubCats *)cats;

SubCatsViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    self.cat.catId = 
    [[self.subCats objectAtIndex:indexPath.row] objectForKey:@"id"];
    self.cat.name = 
    [[self.subCats objectAtIndex:indexPath.row] objectForKey:@"name"];
    if ([self.delegate respondsToSelector:@selector(didSelectSubCats:)]) {
        [self.delegate didSelectSubCats:self.cat];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}
@end

【问题讨论】:

    标签: iphone delegates tableview navigationcontroller


    【解决方案1】:

    dismissViewControllerAnimated:completion: in UIViewController(从 UINavigationController 继承)的文档说:

    呈现视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发到呈现的视图控制器。

    这解释了为什么 SubCatsViewController(并且只有那个视图控制器)被解雇了。 如果 RootViewController 确实是您的根视图控制器,您可以更改 tableView:didSelectRowAtIndexPath: from

    中的行
    [self dismissViewControllerAnimated:YES completion:nil];
    

    [self.navigationController popToRootViewControllerAnimated:YES];
    

    【讨论】:

    • 不是根视图控制器
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多