2011-12-17 23 views
6

Sự cố của tôi có vẻ giống như vấn đề chung, nhưng dường như không thể tìm thấy câu trả lời cho nó.Điều hướng Segue có điều kiện từ UITableViewCell dựa trên phản hồi cho UIAlertView

Tôi có tình huống khi người dùng chạm vào UITableViewCell tùy chỉnh, tôi muốn hiển thị cảnh báo và sau đó dựa trên phản hồi cho cảnh báo, hoặc ở trên cùng một chế độ xem (người dùng chọn hủy) hoặc hiển thị một chế độ xem khác (nếu người dùng chọn tiến hành). Và tôi muốn làm điều này bằng cách sử dụng tính năng bảng phân cảnh & segues.

Làm cách nào để thực hiện điều này? Bạn có phải làm điều này theo cách cũ?

Trả lời

11

@user, Chỉ cần tạo cảnh báoXem cách thời trang cũ; Tôi biết bất kỳ tính năng cốt truyện nào để thực hiện điều này theo cách khác. Nơi bảng phân cảnh có thể trợ giúp là với các phân đoạn. Bạn có thể gọi các segues theo chương trình. Với nút hủy chế độ xem cảnh báo, bạn chỉ có thể quay lại (tức là không làm gì cả). Đối với tùy chọn khác, để hiển thị một chế độ xem khác, bạn có thể gọi theo chương trình để chuyển đổi sang chế độ xem mong muốn. Nếu bạn không có segue thích hợp đã được xác định cho một số lý do khác trên storyboard của bạn, chỉ cần tạo ra một nút ra và sử dụng để tạo ra segue và đặt tên cho nó. Đặt tên cho phân đoạn bằng cách nhấp vào nó trong bảng phân cảnh và sử dụng trình kiểm tra thuộc tính để đặt tên cho nó (số nhận dạng). Sau đó, ẩn nút hoặc đặt nó ra khỏi chế độ xem. Tôi thường đặt các loại nút trên thanh công cụ và sử dụng miếng đệm để giữ chúng ra khỏi chế độ xem. Dưới đây là một số mẫu mã:

Gọi segue từ quan điểm đại biểu cảnh báo như thế này:

[self performSegueWithIdentifier: @"done" sender: self]; 

Cũng thực hiện phương pháp này để làm bất cứ công việc cần thiết để chuẩn bị cho segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     // [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 
     // [[segue destinationViewController] setSelectedClient:selectedClient]; 
    } 
} 
+1

đó là những gì tôi đã làm; chỉ có vẻ như một hack như vậy, tôi đã tìm ra một cách rõ ràng hơn mà tôi đã bỏ qua. –

+1

@user, nếu bạn hoặc bất kỳ ai khác đọc sách này phát hiện ra một địa điểm tốt hơn cho chúng tôi biết. –

8

Bạn có thể tạo ra các phân đoạn trực tiếp từ hàm startViewController đến nhiều destinationViewControllers mà sau đó có thể được "thực hiện" theo lập trình. Bạn không cần phải tạo bất kỳ nút ẩn nào cho chúng, điều này có vẻ như là một hack.

+0

+1, nhưng làm thế nào để bạn tạo phân đoạn trực tiếp từ beginViewController đến nhiều destinationViewControllers? Bạn có nghĩa là chỉ Ctrl-kéo giữa bộ điều khiển xem, và đặt tên cho segues? – brainjam

+1

Có, tôi đã có nghĩa là bạn chỉ cần Ctrl-kéo giữa các bộ điều khiển xem. Điểm chính là bạn không chọn một phần tử của bộ điều khiển khung nhìn bên trong khung nhìn bảng phân cảnh, nhưng bạn chọn chính bộ điều khiển khung nhìn thực tế và Ctrl-drag đến các khung nhìn khác từ nó. Tôi đã làm điều này bản thân mình và nó làm việc độc đáo. – DataJock

+0

Rất tuyệt! Không có nhiều nút ảo cho tôi nữa. –

4

OK Tôi đã đưa ra giải pháp phù hợp với bảng phân cảnh mà tôi thích.

Ví dụ:

Xem bảng của tôi có 2 phần, nhóm và ô là nguyên mẫu động. Phần 0 chứa một hàng/UITableViewCell & Tôi không muốn nó phân biệt. Phần 1 chứa nhiều ô mà tôi muốn kích hoạt chi tiết segue &.

Trong Storyboard:

  • tôi loại bỏ các segue nối tableviewcell với bộ điều khiển xem đích.
  • Tôi đã tạo một khoảng cách 'chung' liên kết bộ điều khiển chế độ xem nguồn trực tiếp với bộ điều khiển chế độ xem đích.
  • Trong các thuộc tính trên segue, tôi đặt số nhận dạng ('EditTimePeriod') và đặt loại thành Push (Tôi đoán Modal sẽ hoạt động giống nhau).

Trong điều khiển xem nguồn:

  • Trong phương pháp prepareForSegue tôi xử lý cả segue 'AddTimePeriod' chung để kiểm soát-kéo từ UIBarButtonItem của tôi (Add), cùng với các 'chung' (vc -> vc) 'Khoảng cách EditTimePeriod'.

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    
        // handle the click of the 'Add' bar button item  
        if([segue.identifier isEqualToString:@"AddTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         // database & entity stuff for adding the new one to the mOC, etc 
        } 
    
        // handle the click of one of the 'editable' cells - 
        if([segue.identifier isEqualToString:@"EditTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         TimePeriod * newTP = [self.timePeriodArray objectAtIndex:self.tableView.indexPathForSelectedRow.row]; 
         tpvc.timePeriod = newTP; 
        } 
    } 
    
  • Sau đó, tôi đã triển khai phương thức tableView: didSelectRowAtIndexPath và đặt điều kiện của tôi tại đây. Nếu hàng được lựa chọn là bên ngoài của phần zero tôi gọi là segue EditTimePeriod bằng tay, xác định người gửi là tableviewcell chọn:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    
        if(self.tableView.indexPathForSelectedRow.section!=0){ 
         [self performSegueWithIdentifier:@"EditTimePeriod" sender:[tableView cellForRowAtIndexPath:indexPath]]; 
        } 
    
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    
        return;  
    } 
    

sẽ được tốt đẹp để mã hóa các tế bào trong phần 0 để nó không phải là lựa chọn ngay từ đầu! Hy vọng điều này sẽ giúp mặc dù.

** và sau đó 5 phút sau, tôi đã xem lại và nhận ra rằng tôi chỉ có thể di chuyển dữ liệu từ phần 0 vào tiêu đề phần, trực quan hơn và không được sử dụng. để thiết kế mở cho một khoảng cách tiêu chuẩn từ mỗi tableviewcell mà không cần bất kỳ điều kiện/kiểm tra nào. Tuy nhiên, dù sao đi nữa cũng là một bài tập tốt :)

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