0

RootViewControllerは、クリックすると にself.navigationControllerプッシュするボタンがありますCategoryViewController

次に、 でCategoryViewController、1 つのセルをクリックして SubCatsViewController にプッシュします。セルを選択したら、それを閉じCategoryViewControllerて にSubCatsViewController戻る必要がありRootViewControllerます。

しかし、それを行う方法は?

私がdismissViewControllerAnimatedを使用すると、 ではなく のみが却下されSubCatsViewControllerますCategoryViewControllerSubCatsViewControllerから選択した値を取得できるようにデリゲートを記述し、必要な値を取得するためにこのデリゲート プロトコルに準拠していますSubCatsViewControllerRootViewController

ただし、作成したデリゲートを使用して値を取得できません。

- (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
4

1 に答える 1

0

UIViewController (UINavigationController が継承する元)の DismissViewControllerAnimated:completion: のドキュメントには、次のように記載されています。

表示側のビュー コントローラーは、表示されたビュー コントローラーを閉じる役割を果たします。提示されたView Controller自体でこのメソッドを呼び出すと、メッセージが提示元のView Controllerに自動的に転送されます。

これは、SubCatsViewController (およびそのビュー コントローラーのみ) が却下される理由を説明しています。RootViewController が実際にルート ビュー コントローラーである場合は、 tableView:didSelectRowAtIndexPath: の行を変更できます。

[self dismissViewControllerAnimated:YES completion:nil];

[self.navigationController popToRootViewControllerAnimated:YES];
于 2013-04-07T12:02:39.827 に答える