web-dev-qa-db-ja.com

3番目のセグエが追加されたときにのみ、deepSelectRowAtIndexPathの前にprepareForSegueが呼び出されました

3つの異なるビューに対して3つのセグエがあります。 2は問題なく実装されていますが、3番目が作成されたときに問題が発生します。

次のdidSelectRowAtIndexPathメソッドがあります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@" ----------  did select row");

    if(indexPath.section == 0){
        if(indexPath.row == [self.data count]-1){
            //prior to adding this, everything works
            [self performSegueWithIdentifier:@"MoreComments" sender:self];
        }else{
            [self performSegueWithIdentifier:@"FriendView" sender:friend];
        }
    }else if(indexPath.section == 1){
        if(indexPath.row == [self.data2 count]-1){
            [self performSegueWithIdentifier:@"MorePosts" sender:self];
        }else{
            [self performSegueWithIdentifier:@"FriendView" sender:friend];
        }
    }
}

次のprepareForSequeメソッドがあります。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"MorePosts"]){
        MorePostsViewController *mfamvc = segue.destinationViewController;
        mfamvc.data = self.data;
    }else if([segue.identifier isEqualToString:@"FriendView"]){
        FriendViewController *fvc = segue.destinationViewController;
        fvc.friend = friend;
    }else if([segue.identifier isEqualToString:@"MoreComments"]){
          MoreCommentsViewController *mcvc = segue.destinationViewController;
          mcvc.data = self.data2;
    }
}

コントロールをセルから最後のビューにドラッグする前に、プログラムがdidselectrowにヒットし、次にprepareforsequeにヒットするのを確認できます。これにより、すべてのビューナビゲーションが完全に機能します。

セルからMoreCommentsViewControllerへのドラッグを制御するとすぐに、エラーが発生し始めます。

入れ子になったプッシュアニメーションにより、ナビゲーションバーが破損する可能性があります。予期しない状態でナビゲーション遷移を終了します。ナビゲーションバーのサブビューツリーが破損する場合があります。

今、prepareforsequeも2回呼び出されていることに気づきました。prepareforsequeが最初に呼び出され、次にdidselectrow、次にprepareforsegueが呼び出されています。

これらの異なるビューに条件付きで移動するために私は何を間違っていますか?

28
Atma

その理由は、テーブルビューセルから複数のビューにドラッグできないためです。 @rdelmarが述べたように、これは誤りです。宛先ビューからソースビューにドラッグしてから、上記の方法で手動で処理する必要があります。

ここにもあります: ITableViewCellをタップすると条件付きセグエが実行されます

4
Atma

セルからdidSelectRowAtIndexPathまたはセグエのいずれかを使用する必要がありますが、両方は使用しないでください。 didSelectRowAtIndexPathでセグエを呼び出す場合、それらのセグエはセルから次のシーンではなくではなく、ビューからである必要がありますシーンの上のバーにあるコントローラーアイコン:

segue between view controllers

この新しいセグエを選択して、「属性インスペクター」に移動できます(option+command+4)、およびperformSegueWithIdentifierを呼び出すときにコードで参照できるストーリーボード識別子を指定します。

79
Rob