2012-04-02 40 views
5

Tôi đã thiết lập Bộ điều khiển Điều hướng trước trong các phiên bản trước của XCode nhưng tôi đang sử dụng phiên bản mới nhất và cố gắng thiết lập Bộ điều khiển. Tôi có Tab Bar điều khiển mà nguồn cấp dữ liệu hai hình thức. Biểu mẫu thứ hai có một UITableview mà tôi muốn sau đó chuyển sang biểu mẫu khác khi người dùng đã thực hiện lựa chọn bằng Trình điều khiển Điều hướng. Tôi đã đặt ra mối quan hệ của tôi trông như thế nào bên dưới.Sự cố khi thiết lập Bộ điều khiển Điều hướng bằng Bảng Câu chuyện

enter image description here

Vấn đề có vẻ là với mối quan hệ của tôi thiết lập. Tôi đã kiểm soát được nhấp từ biểu mẫu thứ hai đến Trình điều khiển Điều hướng và cửa sổ bật lên cung cấp cho tôi lựa chọn từ 'Đẩy, Phương thức hoặc Tùy chỉnh'. Tôi đã chọn 'Push' nhưng khi tôi cố gắng chạy mã dưới đây thì không hoạt động.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 
    NSString *tSel = [listContents objectAtIndex:row]; 

    ConstantRateController *detailController = [[ConstantRateController alloc] initWithNibName:@"ConstantRateController_iPhone" bundle:nil];   
    [self.navigationController pushViewController:detailController animated:YES] 
} 

Tôi đã chạy mã thông qua trình gỡ lỗi và nó chạy mà không có lỗi nhưng biểu mẫu tiếp theo không hiển thị.

Trả lời

9

Từ mô tả của bạn, có vẻ như có ba vấn đề:

  1. Đẩy segues yêu cầu bộ điều khiển xem nguồn được được nhúng trong bộ điều khiển điều hướng - thay vào đó, bạn có bộ điều khiển chế độ xem nguồn đang cố gắng tách biệt thành bộ điều khiển điều hướng.

  2. Trình điều khiển chế độ xem đích cũng phải nằm trong bảng phân cảnh.

  3. Khi bạn đang sử dụng kịch bản, bạn thường không muốn làm theo mô hình cho đẩy điều khiển xem mới từ thế giới trước kịch bản (có nghĩa là, tạo ra một bộ điều khiển xem và đẩy nó trong tableView:didSelectRowAtIndexPath:) ... làm điều đó sao chép một loạt các công việc mà storyboards làm cho bạn.

Thay vào đó:

  1. Đặt điều khiển xem bảng của bạn thành một bộ điều khiển chuyển hướng, và bộ điều khiển chuyển hướng trong bộ điều khiển xem tab.(Bạn có thể thực hiện việc này với trình đơn Trình chỉnh sửa> Nhúng trong hoặc bằng cách kéo chúng ra khỏi thư viện và kéo các kết nối "mối quan hệ" giữa chúng.)

  2. Đặt bộ điều khiển xem đích trong bảng phân cảnh (nếu không đã có) bằng cách kéo ra một bộ điều khiển xem từ thư viện và thiết lập lớp của nó để xem lớp điều khiển của bạn (ConstantRateController).

  3. Kéo một segue đẩy ra khỏi tế bào xem bảng với bộ điều khiển xem điểm đến:

drag to create segue

Sau khi cả ba bước, kịch bản của bạn sẽ giống như thế này:

enter image description here

Cuối cùng, trong bộ điều khiển xem bảng, hãy thực hiện như sau:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // test segue.identifier if needed 
    MyViewController *viewController = segue.destinationViewController; 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    // set properties of viewController based on selection indexPath 
} 

segue tạo và đẩy bộ điều khiển chế độ xem; tất cả những gì bạn cần làm là cấu hình nó để nội dung của nó phản ánh việc lựa chọn bảng gây ra sự phân biệt. (Lưu ý rằng nếu bạn có nhiều segues từ bộ điều khiển xem bảng, bạn nên cung cấp cho mỗi một định danh duy nhất trong IB và thử nghiệm nó trong prepareForSegue:sender: để cấu hình bộ điều khiển xem đích thích hợp.)


Nếu bạn cần hỗ trợ nhiều tách ra khỏi chế độ xem bảng dựa trên ô nào được chọn, có một chút khác biệt. Rõ ràng, bảng phân cảnh không thể biết về các ô được phân bổ bởi đại biểu/dataSource của bạn, do đó bạn không thể thiết lập phân đoạn từ ô ... ít nhất, không phải trong bảng động động. Có vẻ như bạn có thể giống như chế độ xem Cài đặt, nơi bạn có một tập hợp các ô tĩnh, trong đó mỗi ô nên tách biệt với một chế độ xem khác (như một số trang cài đặt). Trong trường hợp đó, bạn có thể muốn xem một tính năng khác mà bạn nhận được từ bảng phân cảnh: bảng tĩnh. Nếu bạn chọn chế độ xem bảng (không phải bảng điều khiển xem bảng) trong IB, đầu thanh tra thuộc tính cho phép bạn chuyển đổi giữa các mẫu động và các ô tĩnh - trước đây là những gì tôi đã mô tả ở trên và sau đó cho phép bạn tạo ô và các phần và chỉnh sửa nội dung hoàn toàn bằng IB. Với các ô tĩnh, bạn có thể tạo ra một khoảng cách khác nhau từ mỗi ... để bạn có thể tạo giao diện người dùng giống như Cài đặt nhiều trang hoàn toàn bằng IB (tất nhiên, bạn vẫn cần mã để làm điều gì đó khi các công tắc được lật và không có gì).

Nếu bạn cần hỗ trợ nhiều segues ra khỏi một động bảng , bạn sẽ cần hai điều:

  1. Một nguồn gốc khác nhau cho các segues - bạn không thể có nhiều segues sắp ra của một ô, nhưng bạn có thể có nhiều phân đoạn sắp ra khỏi chính bộ điều khiển xem (bảng).

  2. Logic để chọn khoảng cách dựa trên hành động của người dùng. Ở đây chúng tôi quay lại tableView:didSelectRowAtIndexPath:, nhưng thay vì tạo bộ điều khiển chế độ xem mới và đẩy bộ điều khiển điều hướng hoặc hiển thị nó theo cách thức, bạn chỉ cần gọi performSegueWithIdentifier: trên self.

Có một ít chi tiết hơn về như vậy trong this answer, và nhiều hơn nữa về thực hành lập trình kịch bản nói chung trong Apple's view controllers guide:

+0

Cảm ơn bạn đã trả lời của bạn, tôi đã làm theo hướng dẫn và thêm mã ở trên nhưng khi tôi chạy nó PrepareForSegue không bao giờ được gọi. Tôi đã bỏ lỡ điều gì? – user616076

+0

Các dự đoán hàng đầu: 1) Phương thức 'preparForSegue: sender:' của bạn có ở đúng lớp không? Nó sẽ ở trong bộ điều khiển xem bắt đầu phân đoạn (bộ điều khiển xem bảng của bạn). 2) Bộ điều khiển xem bảng có thực sự là lớp đó không? Kiểm tra bộ kiểm định danh tính trong IB để đảm bảo rằng nó không phải là một 'UITableViewController' chung. – rickster

+0

Hiện tại, bạn đang làm việc tốt, cảm ơn bạn, đó là vì tôi đã không đặt đúng mã nhận dạng Segue. Điều gì sẽ xảy ra nếu tôi muốn chuyển sang nhiều Phân đoạn, giả sử từ bảng của tôi, mỗi lựa chọn có thể chuyển đến bất kỳ một trong 10 biểu mẫu khác? – user616076

0

thử dùng phương thức "loadView" và để viewDidLoad trên lớp ViewController mà bạn muốn hiển thị.

2

Thông thường khi bạn muốn sử dụng một bộ điều khiển Nav, bạn phải nhúng nó ...

Xcode chứa một cách tuyệt vời của việc thêm vào menu và thanh thẻ điều khiển - mặc dù đó là một chút ẩn đi . Đầu tiên, chọn bộ điều khiển xem và chuyển đến trình đơn Trình chỉnh sửa -> Nhúng trong -> Tabbar Bộ điều khiển. Xcode sẽ tự động tạo bộ điều khiển mới của chúng tôi và liên kết bộ điều khiển chế độ xem hiện tại. Một lần nữa, chọn View Controller và lần này vào menu Editor -> Embed In -> Bộ điều khiển điều hướng. Bạn sẽ thấy rằng Xcode chèn bộ điều khiển điều hướng mới giữa bộ điều khiển thanh tab và bộ điều khiển xem . Rất đẹp - cho đến nay, rất tốt! quan điểm của bạn sẽ trông như thế này ...

[từ: http://maybelost.com/2011/10/tutorial-storyboard-in-xcode-4-2-with-navigation-controller-and-tabbar-controller-part1/]

0

bạn nhìn thấy ba segues ('Push, phương thức hay Tùy chọn') và không thấy ' root view controller 'nếu bạn có bạn Điều khiển chuyển hướng CHUYỂN ĐỔI từ ViewController thông thường bằng cách thay đổi lớp CUSTOM của nó. Có, nó được gọi là 'Điều khiển điều hướng trong Storyboad. Nhưng biểu tượng màu vàng của nó thì khác. Nó thiếu phần 'Điều khiển Điều hướng' trong các thuộc tính và nó KHÔNG hoạt động như Trình điều khiển Điều hướng. Điều này có thể được sửa bằng cách thay đổi nguồn xml của tệp Storyboard. Nó thực sự khó hiểu tại sao họ gọi nó là "nhúng" ..

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