2011-10-30 23 views
39

Tôi đang làm việc trên một số dự án cho iOS 5 sử dụng Xcode 4.2. Tôi có một UITableViewController và muốn thực hiện một segue khi người dùng gõ vào ô bảng, nhưng bộ điều khiển xem đích phụ thuộc vào hành động thực hiện trên ô đó. Ví dụ, khi người dùng gõ vào ô, tôi muốn tải SomeViewController, nhưng khi người dùng chạm vào cùng một ô trong chế độ chỉnh sửa, tôi muốn tải một ứng dụng khác. Thật không may, không có cách nào để cấu hình nhiều phân đoạn trên cùng một ô trong trình xây dựng cốt truyện Xcode 4.2, hoặc tôi không nhận được nó. Có lẽ có một cách để tạo segue bằng tay, trong trình soạn thảo mã. Nói chung những gì tôi muốn đạt được là cung cấp cho người dùng một cách để "nhập" mục được biểu diễn bằng ô bằng cách sử dụng một bộ điều khiển chế độ xem và "chỉnh sửa" mục được đại diện bởi cùng một ô bằng cách sử dụng bộ điều khiển chế độ xem khác. Chuyển sang trình điều khiển xem thứ hai (trình soạn thảo) khi ở chế độ bảng chỉnh sửa chỉ là lần đầu tiên của tôi, nhưng có thể có một cách tốt hơn. Bất kỳ trợ giúp sẽ được đánh giá cao.Phân đoạn có điều kiện được thực hiện khi chạm vào UITableViewCell

+2

Tôi vừa mới figured it out. Nó đơn giản, và có thể được thực hiện bằng cách sử dụng trình soạn thảo kịch bản Xcode. Tôi đã thêm hai segues vào TableViewController của tôi trỏ đến bộ điều khiển xem khác nhau, và tôi đang kích hoạt một mã thích hợp từ mã khi người dùng chọn một ô, và tùy thuộc vào nó được thực hiện trong chế độ chỉnh sửa hay không - Tôi đang kích hoạt segue thích hợp. Trước đó tôi đã cố gắng để thêm nhiều segue để phù thủy cùng một tế bào là không thể. – Darrarski

+3

Nó sẽ là tốt đẹp nếu bạn xây dựng trên này vào một câu trả lời, cho thấy chính xác cách bạn thiết lập các segues. – JohnMerlino

+0

Tôi đang đối mặt với cùng một vấn đề, tôi có hai bộ điều khiển xem đích với segues từ nguồn nhưng không biết làm thế nào để kích hoạt segue cụ thể ??? – Bear

Trả lời

53

Trong khi tìm kiếm Bảng phân cảnh, hãy kéo điều khiển từ bộ điều khiển Xem nguồn của bạn vào bộ điều khiển Chế độ xem đích. Điều này sẽ tạo ra một khoảng cách mà bạn có thể kích hoạt lập trình ngay từ nguồn của bạn Xem điều khiển. Đảm bảo rằng bạn cung cấp cho bạn một tên Segue. Tên này là những gì bạn sẽ chuyển sang phương thức performSegue của phương thức View Controller: withIdentifier:.

+5

Các bit thường bị bỏ lỡ trong các câu trả lời tôi đã thấy cho câu hỏi này là làm thế nào để phát hiện các liên lạc mà thông thường gây nên segue bây giờ mà bạn đã tách nó ra khỏi tế bào. Câu trả lời là để thực hiện 'tableView: didSelectRowAtIndexPath:' trong UITableViewController của bạn - ngay cả khi đó là dạng xem bảng tĩnh. Trong phần thân của phương thức đó, bạn đặt mã điều kiện và gọi 'performSegue: withIdentifier:' khi điều kiện là đúng – Rhubarb

+0

Vấn đề là bạn có thể thiết lập nhiều hơn một phân đoạn từ một ô mẫu tableView. Chỉ cần cung cấp cho họ số nhận dạng riêng biệt. Bằng cách đó trong didSelectRowAtIndexPath của bạn: bạn có thể thiết lập một điều kiện nếu ([self.tableview isEditing]) và gây ra sự phân biệt bằng cách sử dụng định danh bạn thiết lập. – smileBot

33

Tôi đang thêm câu trả lời bổ sung chỉ vì sau khi đọc câu trả lời được chọn ở trên nhiều địa điểm khác ngoài điều này - và nó câu trả lời đúng - tôi thấy mình tự hỏi làm thế nào để phát hiện cảm ứng thường kích hoạt phân đoạn . Bạn thấy đấy, nếu bạn tạo segue của bạn theo cách thông thường bằng cách kéo ctrl từ ô xem bảng tới bộ điều khiển tiếp theo, thì hai thứ được thực hiện tự động cho bạn.

  1. các liên lạc trong tế bào được phát hiện
  2. các segue được thực hiện

nhưng tất nhiên, bạn không thể chặn segue.

Bây giờ nếu bạn muốn có điều kiện segue, sau đó (như được đề cập trong các câu trả lời khác) bạn xóa phân đoạn đó và tạo một cái mới từ UITableViewController (kéo nó từ điều hướng đối tượng thay vì bảng phân cảnh) điều khiển - và đặt tên cho nó.

Sau đó - và đây là phần tôi bị thiếu - triển khai tableView:didSelectRowAtIndexPath trong bộ điều khiển xem bảng của bạn để thực hiện segue theo chương trình và có điều kiện, như sau.

Lưu ý rằng bạn cũng cần phải xác định ô của mình bằng cách nào đó để bạn biết liệu người bạn quan tâm đã được chọn chưa. Bạn có thể làm điều đó bằng cách biết đường dẫn chỉ mục trong một bảng tĩnh, nhưng tôi thích đặt các số nhận dạng duy nhất của ô trong IB (mặc dù tôi không cần nó cho dequeueing vì nó là một bảng tĩnh) và kiểm tra nó. Bằng cách đó, nếu tôi di chuyển ô của tôi lên hoặc xuống trong bảng tĩnh, tôi sẽ không cần thay đổi mã này.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Find the selected cell in the usual way 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    // Check if this is the cell I want to segue from by using the reuseIdenifier 
    // which I set in the "Identifier" field in Interface Builder 
    if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) { 

    // Do my conditional logic - this was the whole point of changing the segue 
    if (myConditionForSegueIsSatisfied) { 
     // Perform the segue using the identifier I was careful to give it in IB 
     // Note I'm sending the cell as the sender because that's what the normal 
     // segue does and I already had code counting on that 
     [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell]; 
    } 
} 

Lưu ý cách gửi ô bằng segue - khoảng cách bình thường từ ô đã thực hiện, và ban đầu tôi đã chuyển đến 0 và mã của tôi phụ thuộc vào nó ngừng hoạt động.

+0

Điều đó đã làm những gì tôi cần. Cảm ơn – Critter

+0

Xóa seque và thêm lại là khóa - nếu bạn đã sử dụng mẫu chi tiết chính để tạo dự án của mình. Cảm ơn bạn. – Stiefel

+0

Kéo nó từ UITableViewController! Đó là nó ... Tôi đã tự hỏi làm thế nào để (không lập trình) tạo ra một khoảng cách mà không gắn liền với một cái nhìn cụ thể. – maganap

5

Đây là một câu hỏi cũ và một số đáp án đúng lớn nhưng tôi sẽ đăng một số thông tin bổ sung Tôi cảm thấy hữu ích khi tôi gặp phải điều này:

  1. Nếu bạn tạo một segue trong kịch bản bởi ctl + kéo từ SomeVC đến AnotherVC, xóa nó.

  2. Trong điều hướng đối tượng, ctl + kéo ở cấp ViewController (thường là đầu tiên trong cấu trúc phân cấp dưới tên của VC) từ SomeVC đến AnotherVC. Cung cấp cho segue một định danh duy nhất.

  3. Triển khai tableView: didSelectRowAtIndexPath: như mô tả ở trên.

  4. tôi tìm thấy nó hữu ích để sử dụng một tuyên bố switch trong tableView: didSelectRowAtIndexPath:

    switch (indexPath.row) { 
    case 0: 
        [self performSegueWithIdentifier:@"yourIDHere" sender:self]; 
        break; 
    case 1: 
        // enter conditional code here... 
        break; 
    case 2: 
        // enter conditional code here... 
        break; 
    // ... for however many cells you require 
    
    default: 
        break; 
    

    }

Cảm ơn câu trả lời tuyệt vời tất cả mọi người.

0

Bạn có thể dễ dàng kiểm soát khai mạc của bất kỳ segue trong tùy chỉnh của bạn UIViewController bằng cách thực hiện:

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }

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