2013-11-27 18 views
7

Tôi có chế độ xem bảng với các loại ô xem bảng khác nhau trong đó. Trong một trong các ô, có hai nút, tải một bộ điều khiển xem khi được nhấn. Tôi đang sử dụng chức năng sau để xử lý nút nhấn:iOS segue được thực thi hai lần

- (IBAction)leftButtonPressed:(id)sender 
{ 
    // Getting the pressed button 
    UIButton *button = (UIButton*)sender; 
    // Getting the indexpath 
    NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0]; 
    // Loading the proper data from my datasource 
    NSArray *clickedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indPath.row]; 
    [[SOEventManager sharedEventManager] setSelectedEvent:clickedEvent[0]]; 
    // Everything working as it should up to this point 
    // Performing seque... 
    [self performSegueWithIdentifier:@"buttonSegue" sender:self]; 
} 

Nút của tôiĐược cho là sẽ đẩy bộ điều khiển chế độ xem mới. Bằng cách nào đó thay vì đẩy một lần, nó dường như được đẩy hai lần, vì vậy tôi nhận được cảnh báo sau đây:

2013-11-27 01:48:30.894 Self-Ordering App[2081:70b] nested push animation can result in corrupted navigation bar 
2013-11-27 01:48:31.570 Self-Ordering App[2081:70b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 

Trong trường hợp của tôi nó dẫn đến một vụ tai nạn, kể từ khi có một sự kiện mà tôi muốn ứng dụng ngay lập tức bật bộ điều khiển xem để nó trở lại chế độ xem bảng của tôi. Tôi sử dụng một alertview cho điều này và xử lý sự kiện này như sau:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex]; 
    // ... 
    // Additional checking of button titles.... 
    else if ([buttonTitle isEqualToString:NSLocalizedString(@"Vissza", nil)]) 
    { 
     [self.navigationController popViewControllerAnimated:YES]; 
    } 
} 

Nó có thể cho tôi thú vị để lưu ý rằng tôi có một segue khác từ "bình thường" tế bào xem bảng của tôi, và trong trường hợp đó tôi sử dụng prepareForSegue : phương pháp

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"detailSegue"]) 
    { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     SOEvent *selectedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indexPath.row]; 
     [[SOEventManager sharedEventManager] setSelectedEvent:selectedEvent]; 
    } 
} 

Trong trường hợp này, bộ điều khiển chế độ xem được đẩy hoàn hảo và thậm chí xuất hiện ngay lập tức nếu cần. Tôi đang thử nghiệm này trên iOS7 và Xcode 5. Tôi đã không gặp phải một vấn đề như thế này trước đây, bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

+5

bạn có chắc chắn bạn đã thực hiện đúng các hành động trong trình tạo giao diện không? có lẽ bạn đã kết nối sự kiện này, ví dụ, cả hai chạm vào bên trong và chạm vào bên trong thay vì chỉ chạm vào bên trong. hoặc có lẽ bạn cũng đã gán phân đoạn từ cả hai mã và một lần nữa trong trình tạo giao diện. bạn đã kiểm tra chúng chưa đó là một sai lầm phổ biến. –

+0

Oh chết tiệt .. Bạn đang thực sự đúng, tôi gán các nút của tôi cũng trong các phương pháp xem nguồn dữ liệu bảng .. Cảm ơn bạn đã trả lời! –

Trả lời

16

trả lời bởi thể poyrazoğlu:

bạn có chắc bạn đã có dây lên các hành động một cách chính xác trong giao diện xây dựng? có thể bạn đã kết nối sự kiện cho, ví dụ, cả hai chạm vào bên trong và chạm vào bên trong thay vì chỉ chạm vào bên trong. hoặc có thể bạn đã cũng chỉ định segue từ cả hai mã và một lần nữa trong trình tạo giao diện. bạn đã kiểm tra chúng chưa? đó là một sai lầm phổ biến. -

Tôi đã chỉ định thao tác chạm bên trong cho mỗi nút cả bảng phân cảnh và phương pháp nguồn dữ liệu của bảng phân cảnh của tôi.

Cảm ơn sự giúp đỡ nhanh chóng của bạn có thể poyrazoğlu !!

+0

ồ, tôi đã không thực sự nghĩ về xem bảng, nhưng vui mừng khi thấy nó đã giúp. bạn được chào đón :) –

+0

Tôi cũng đang tải bộ điều khiển xem mới 2x. Tôi kết nối segue từ bộ điều khiển xem thay vì ô xem bảng và điều này giải quyết được vấn đề. – JeffK

12

Có thể bạn muốn kết nối các phân đoạn của mình với Bộ điều khiển chế độ xem thay vì UIButtons!

Bạn nên có lẽ đã là segues dây với một số nút như thế này: enter image description here

Nhưng bạn nên dây chúng với các bộ điều khiển xem thay vì: enter image description here

+0

Điều này làm việc cho tôi! (Swift 4, Xcode 9). Không chắc tại sao điều này không được nhấn mạnh nhiều hơn nữa! Sử dụng một đại biểu, nếu segue có dây giữa một nút (trong một ô bảng), nó sẽ luôn luôn cháy, và đại biểu của tôi sẽ được thực hiện sau đó. Có dây để xem tế bào, điều này không xảy ra, vì vậy cuộc gọi thủ công của tôi để làm segue hoạt động như kế hoạch. – DavidG

1

tôi luôn nhận được vấn đề này khi tôi có các nút của tôi được kết nối trực tiếp với bộ điều khiển xem đích. Bạn cần phải chắc chắn rằng bạn đầu tiên xóa segue cũ bạn đã thực hiện, sau đó bấm vào bộ điều khiển xem hiện tại (nơi bạn đang đến từ) và CTRL + bấm vào bộ điều khiển đích.

này nên sửa chữa nó :)

5

Đối Swift 3, xcode, và ios 9+, đó là những gì tôi đang sử dụng: Đảm bảo bạn đang vẽ segue từ UIViewControllers của bạn và không nút hoặc giao diện khác.

Tôi đã có cùng một vấn đề, và chỉ đơn giản là thay đổi sự bắt đầu của segue từ UIController thay vì nút gỡ bỏ lỗi này.

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