24

Tôi có 3 segues đến 3 quan điểm khác nhau. 2 được thực hiện với không có vấn đề, đó là khi thứ ba được tạo ra rằng các vấn đề xảy ra.PrepareForSegue được gọi trước khi didSelectRowAtIndexPath chỉ khi thứ ba segue được thêm

tôi có phương pháp didSelectRowAtIndexPath sau:

- (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]; 
     } 
    } 
} 

tôi có phương pháp prepareForSeque sau:

-(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; 
    } 
} 

Trước khi kiểm soát kéo từ tế bào của tôi vào xem cuối cùng tôi có thể thấy rằng chương trình của tôi chạm didselectrow và sau đó chuẩn bị. Điều này làm cho tất cả điều hướng xem hoạt động hoàn hảo.

Ngay sau khi tôi điều khiển kéo từ tế bào của tôi vào MoreCommentsViewController tôi bắt đầu thấy lỗi:

lồng nhau hoạt hình push có thể dẫn đến hỏng thanh điều hướng Kết thúc quá trình chuyển đổi chuyển hướng trong trạng thái bất ngờ. Cây con trong thanh điều hướng có thể bị hỏng.

Tôi nhận thấy rằng bây giờ cũng chuẩn bị được gọi là hai lần, với chuẩn bị được gọi là đầu tiên, sau đó didselectrow, sau đó preparforsegue một lần nữa.

Tôi đang làm gì sai để có điều kiện đi đến các chế độ xem khác nhau này?

+0

Điều gì đó có thể sai với cách thức các khoảng cách được kết nối. Bạn có thể mô tả những gì bạn đã làm trong IB hoặc đăng một liên kết đến một hình ảnh của bảng phân cảnh của bạn không? Bạn đang kết nối nhiều phân đoạn trực tiếp từ một nguyên mẫu ô? Nếu vậy, đó là những gì sai. – rdelmar

+0

vâng tôi đang kết nối nhiều phân đoạn từ một nguyên mẫu ô. Tôi đoán đó là vấn đề – Atma

Trả lời

2

Lý do là bạn không thể kéo từ ô xem bảng đến nhiều chế độ xem. Như @rdelmar đã đề cập điều này là sai. Bạn nên kéo từ đích đến khung nhìn nguồn và sau đó xử lý theo cách thủ công như tôi đã làm ở trên.

Cũng có thể tìm thấy tại đây: Conditional segue performed on tap on UITableViewCell

+0

Hơn nữa, nếu bạn đang sử dụng 'didSelectRowAtIndexPath' để phân biệt có điều kiện thành một trong hai cảnh đích có thể, những phân đoạn đó sẽ _not_ bắt nguồn từ nguyên mẫu ô của bộ điều khiển nguồn. nên bắt nguồn từ biểu tượng trình điều khiển chế độ xem bên dưới cảnh, thay vào đó. Nếu bạn có phân đoạn từ ô cũng như 'didSelectRowAtIndexPath' gọi các phân đoạn, bạn sẽ kết thúc việc gọi _two_ segues, rõ ràng không phải là ý định. – Rob

70

Bạn nên sử dụng didSelectRowAtIndexPath hoặc phân đoạn từ ô, chứ không phải cả hai. Nếu bạn muốn didSelectRowAtIndexPath để gọi segues của bạn, những segues nên không được từ tế bào đến hiện trường tiếp theo, mà đúng hơn là từ biểu tượng xem điều khiển ở thanh phía trên cảnh:

segue between view controllers

Bạn có thể bây giờ chọn phân đoạn mới này, chuyển đến "thanh tra thuộc tính" (tùy chọn + lệnh +) và cung cấp mã nhận dạng bảng phân cảnh mà bạn có thể tham chiếu trong mã khi gọi performSegueWithIdentifier.

+1

Cảm ơn, điều này có ý nghĩa. – MQoder

+0

Làm thế nào để bạn có được phương thức destinationViewController bằng phương thức này? – rigdonmr

+0

@rigdonmr - cho dù bạn đã thêm một segue trong trình xây dựng giao diện hay bạn đã lập trình được gọi là 'performSegueWithIdentifier' trong' didSelectRowAtIndexPath', một trong hai cách, 'prepareForSegue' sẽ được gọi, và sau đó bạn có thể tham chiếu' segue.destinationViewController' ở đó. – Rob

Các vấn đề liên quan