13

1. Bước: Tạo một UIViewController mới:
- Xcode -> New File ... -> Cocoa Touch Class -> UIViewController
- Tên: MyViewControllerLàm thế nào để thêm một bộ điều khiển điều hướng với bộ dựng giao diện?

2. Bước: Kéo và thả một "Navigation Controller" (UINavigationController) từ Thư viện để MyViewController.xib

alt text

3.Bước: Tôi chắc chắn, tôi phải làm một cái gì đó để kết nối các điều khiển chính xác, phải không?

4.Step: Cố gắng khởi động mới View Controller như một hộp thoại modal:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
NSLog(@"navContr: %@", myViewController.navigationController); 
[self.navigationController presentModalViewController: myViewController animated:YES]; 

Kết quả: "navContr: nil"

5.Step: Bạn có thể xem chế độ xem mới (MyViewController), nhưng không có NavigationController và không có UINavigationBar.

Cảm ơn bạn rất nhiều vì đã giúp đỡ!


UPDATE 1:

6.Step: tôi đặt một UIViewController mới (ViewNavi2) như "Root View Controller":
alt text

7.Step: Tôi định nghĩa một IBOutlet UINavigationController *navigationController trong lớp MyViewController và cấu hình xib: Trình điều khiển Điều hướng -> Kết nối -> Tham chiếu Cửa hàng

Nhưng điều khiển Navigation của tôi vẫn là con số không :-(

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
NSLog(@"navContr: %@", myViewController.navigationController); 
// -> "navContr: nil" 
+2

[ở đây] (http://rdcworld-iphone.blogspot.in/2013/03/how-to-add-navigation-controller-in.html) là hướng dẫn đơn giản để thêm Bộ điều khiển điều hướng – swiftBoy

Trả lời

15

Tôi cũng muốn bao gồm bộ điều khiển điều hướng trong tệp NIB, nhưng tất cả tài liệu của Apple nói là "không tối ưu "mà không thực sự giải thích làm thế nào để làm điều đó. Tôi muốn cửa sổ tab chính của tôi để gọi lên một cửa sổ phương thức có chứa các điều khiển điều hướng điển hình mà không cần xác định bộ điều khiển chuyển hướng lập trình. Tôi sẽ chia sẻ cách tôi đã làm nó.

Mã của bạn rất giống với của tôi, vì tôi cũng đã xác định một IBOutlet UINavigationController *navigationController trong MyViewController. Từ giao diện Builder, tôi chỉ đơn giản là định nghĩa quan điểm của tôi trong bộ điều khiển xem gốc và thiết lập của chủ sở hữu tập tin-> xem để định nghĩa xem đó.

Và tương tự như mã của bạn, tôi đã làm như sau trong cửa sổ mẹ tôi:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[self presentModalViewController:myViewController animated:YES]; 

(. Tôi gọi presentModelViewController của bản thân tôi không biết lý do tại sao bạn có self.navigationController) Khi tôi thử nghiệm này, kết quả là chế độ xem của tôi đã được tải từ tệp NIB nhưng thanh điều hướng bị thiếu. Một dòng nhiều mã trong MyViewController cố định này:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self setView:myNavigationController.view]; 

} 

Tất cả tôi đang làm ở đây, được thiết lập xem MyViewController để trỏ đến myNavigationController.view, trong đó có tất cả mọi thứ đã được định nghĩa trong file NIB, bao gồm bộ điều khiển chuyển hướng.

+1

Cảm ơn bạn rất nhiều vì câu trả lời tuyệt vời của bạn! Tôi chắc chắn rằng điều này sẽ giúp rất nhiều người! :-) @all: vui lòng VOTE UP – Manni

+0

@Henry Tôi đã cố gắng làm điều gì đó rất giống nhau. Điều này đã cứu tôi rất nhiều công việc. Cảm ơn! – Besi

+0

Rất đẹp explain.Thanks. –

0

Mã tiếp theo là sẽ không cung cấp cho bạn bất kỳ đối tượng hợp lệ.

NSLog(@"navContr: %@", myViewController.navigationController); 

Lý do là vì thuộc tính navigationController của UIViewController only returns a navigation controller if the view controller is in its stack. This property is nil if a navigation controller cannot be found. Bộ điều khiển chế độ xem của bạn không nằm trong ngăn điều khiển điều hướng. Dù sao tôi thậm chí không chắc chắn nếu bạn khởi tạo chính xác bộ điều khiển điều hướng của chúng tôi. Đọc một số tài liệu.

+0

Cảm ơn bạn đã dành cho bạn giúp đỡ, quá! Nó seams, rằng "bộ điều khiển xem không có trong ngăn xếp của nó". Có, tôi nghĩ rằng tôi không khởi tạo đúng bộ điều khiển điều hướng của mình. Nhưng làm thế nào tôi có thể làm điều đó trong giao diện Builder? Tôi cập nhật câu hỏi của mình, vui lòng xem "UPDATE 1". – Manni

+0

Ngoài ra, nếu chế độ xem của bạn IS trong ngăn điều khiển nav nhưng bạn (tự động) phát hành nó ở nơi bạn không nên có, self.navigationController có thể là 0. Doh! – AndrewS

2

Xem mẫu trong XCode cho "Ứng dụng dựa trên điều hướng". (Dự án mới -> Ứng dụng dựa trên điều hướng) Sau đó mở tệp MainWindow.xib trong Trình tạo giao diện. Mặc dù nó không phải là một cái nhìn, nghĩ về nó như là viewcontroller mà bạn đã tạo ở bước 1. Sau đó nhìn vào "Root View Controller" được tham chiếu trong thanh tra và xem nó được kết nối với bộ điều khiển "Root View Controller" các thanh tra thuộc tính và lớp "RootViewController" trong thanh tra Identity.

Bạn sẽ muốn đặt nội dung bạn muốn hiển thị ở gốc của điều hướng trong phiên bản "RootViewController" của bạn. Thông thường, bộ điều khiển được hiển thị tiếp theo là "DetailViewController".Một lần nữa, hãy đọc qua mã ví dụ mà mẫu cung cấp và bạn sẽ thấy cách bắt đầu từ đó. Nhìn vào mã nhận xét trong didSelectRowAtIndexPath trong mẫu ví dụ của RootViewController.m. Bạn sẽ cần tạo bộ điều khiển xem của riêng mình để phục vụ như là DetailViewController.

Hy vọng điều này sẽ xóa mọi thứ cho bạn.

// EDITS dựa trên Nhận xét của bạn //
Tài liệu của Apple nói rằng nếu bạn muốn sử dụng IB để tạo Bộ điều khiển điều hướng, bạn nên đặt chúng trong MainWindow.xib. Tôi đã tinkering với thực tế là bạn không thể có NavigationController như là một subview của đối tượng UIView của bạn. Những gì bạn có thể làm cho nơi bạn đã bắt đầu là sử dụng IB để thêm đối tượng thanh Điều hướng vào bộ điều khiển chế độ xem của bạn và sau đó kiểm soát mọi thứ từ đó.

Từ tài liệu Apple "Mặc dù bạn cũng có thể tải trình điều khiển điều hướng độc lập hoặc được trình bày từ tệp nib chính của bạn (hoặc bất kỳ tệp nib nào khác), làm như vậy không phải là tối ưu. bộ điều khiển điều hướng theo chương trình tại điểm sử dụng. "

// CÁC CHỈNH SỬA KHÁC // Trong XCode4, mẫu dự án giờ đây được gọi là dự án "Chi tiết chính". Điều này là bởi vì nó sẽ được thiết lập như một bộ điều khiển chia tách trong iPad nhưng vẫn là một dự án định hướng thông thường trong iPhone. Khi tôi tham khảo "RootViewController" trong câu trả lời, bây giờ bạn sẽ tìm thấy một cái gì đó gọi là "MasterViewController"

+0

Cảm ơn bạn rất nhiều vì đã giúp bạn! Tôi phân tích cẩn thận ứng dụng dựa trên điều hướng. Có, có MainWindow.xib với Bộ điều khiển Điều hướng đang hoạt động. Nó được kết nối với AppDelegate, đó là sự khác biệt duy nhất đối với MyViewController của tôi. Trong dự án mẫu, bạn không thể thấy cách MainWindow.xib được khởi tạo và có thể mã của tôi "MyViewController * myViewController = [[MyViewController alloc] initWithNibName: @" MyViewController "bundle: nil];" là sai. Vui lòng xem "CẬP NHẬT 1" trong câu hỏi của tôi. – Manni

+0

Từ tài liệu Apple "Mặc dù bạn cũng có thể tải các trình điều khiển chuyển hướng độc lập hoặc được trình bày từ tệp nib chính của bạn (hoặc bất kỳ tệp nib nào khác), làm như vậy không phải là tối ưu. tại thời điểm sử dụng. " – Walter

+0

Vâng, bạn nói đúng, sẽ dễ dàng hơn để tạo bộ điều khiển điều hướng theo lập trình, nhưng tôi phải làm điều này với Bộ dựng giao diện. Lý do bạn có thể tìm thấy ở đây: http://stackoverflow.com/questions/4604647/how-to-create-an-uiviewcontroller-with-uinavigationcontroller-with-interface-buil Bạn vẫn còn có một số ý tưởng cho tôi? – Manni

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