6

Tôi đang gặp sự cố khi đặt Chế độ xem cửa sổ xem mặc định của Bộ điều khiển Xem trong Bộ dựng giao diện. Đây là thiết lập của tôi:UINavigationController NIB yêu cầu Chủ sở hữu tệp phải có chế độ xem?

Tôi có một ứng dụng TabBar dựa nơi tôi tải một điều khiển Navigation như một cái nhìn modal ...

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil]; 
[tabBarController presentModalViewController:menu animated:anim]; 

MenuController bản thân được cấu trúc như sau:

 
MenuController.xib 
    File's Owner (MyNavCtrlrSubClass : UIViewController) 
    Navigation Controller (UINavigationController) 
    Navigation Bar (UINavigationBar) 
    Root View Controller (Nib Name is set to load AnotherViewController.nib) 
     Navigation Item -> (UINavigationItem) 

này tất cả hoạt động tốt, ngoại trừ khi MyNavCtrlrSubClass được tải, tôi nhận được lỗi sau:

Loaded the "MenuController" nib but the view outlet was not set

Rõ ràng tại sao điều này xảy ra - Chủ sở hữu tệp không có kết nối đầu ra cho chế độ xem của nó. Câu hỏi đặt ra là tôi nên đặt chế độ xem như thế nào và có phải đặt một thứ gì đó ở vị trí đầu tiên không? Thanh điều hướng là ứng cử viên duy nhất trong MenuController.xib, nhưng làm điều này sẽ chỉ kích thước UINavigationBar chính nó vào chế độ toàn màn hình, vì vậy để nói chuyện.

Tôi rõ ràng thiếu thứ gì đó trong IB, nhưng sao? MyNavCtrlrSubClass.m không có mã, ngoại trừ IBOutlet cho UINavigationController. Tôi có mắc sai lầm khi cố thiết lập hoàn toàn điều này trong IB không? Ý tưởng là giữ cho Bộ điều khiển phương thức trong một nib, và tất cả các khung nhìn nó tải trong các ngòi riêng biệt, nhưng vì MenuController chỉ là một thùng chứa cho điều hướng và không chứa chính khung nhìn, tôi rõ ràng đang thiết kế nó sai. :)

Nếu bạn đang tự hỏi tại sao tôi không thiết kế theo cách khác, đó là vì tôi đang cố gắng tuân theo nhận thức của tôi về cách IB yêu cầu bạn xây dựng một hệ thống phân cấp lý tưởng.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

5

Tôi nghĩ bạn có thể không hiểu Chủ sở hữu tệp được sử dụng như thế nào trong tệp NIB. Tôi đã viết một câu trả lời mô tả chủ sở hữu của tập tin under another question.

Khi bạn gọi dòng này:

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil] 

Bạn tạo một thể hiện của MyNavCtrlrSubClass, và nói với nó để nạp @ "MenuController". Sau đó, trong tập tin MenuController.xib, có một UINavigationController không liên quan thứ hai với những thứ bên trong nó. Khi MenuController.nib được nạp vào thời gian chạy, bộ điều khiển điều hướng thứ hai sẽ được tạo ra.

Vấn đề thứ hai là yêu cầu UINavigationController tải một tệp NIB không thực sự hợp lý vì trình điều khiển điều hướng tạo và quản lý chế độ xem của riêng chúng. Bạn thực sự muốn tạo bộ điều khiển chế độ xem gốc và cho trình điều khiển chế độ xem đó tải một tệp NIB.

Hãy thử điều này:

MyRootViewController *rootController = [[[MyRootViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil] autorelease]; 
MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc] initWithRootViewController:rootController]; 

đâu XIB file của bạn trông như thế này:

  • tập tin của chủ sở hữu (Lớp thiết lập để MyRootViewController, xem ổ cắm kết nối với UIView tiếp theo)
  • UIView
    • Tiểu sử A
    • subview B

Sau khi bạn confortable với cách tất cả điều này đang làm việc, bạn cũng có thể xem xét instantiating điều khiển xem điều khiển chuyển hướng và rễ trong một tập tin XIB như bạn đang bắt đầu để làm trong các mã Bạn đã đăng.

+0

Cảm ơn bạn đã trả lời thông tin! Tôi sắp xem những gì tôi có thể làm với điều này và sẽ sớm đăng lại. Bây giờ, hãy để tôi hỏi: làm thế nào sau đó bạn sẽ tải một nib điều khiển điều hướng phương thức, thiết kế càng nhiều càng tốt trong giao diện Builder? Có cần thiết, như trong ví dụ của bạn, để thiết lập một bộ điều khiển View nib và sau đó tạo Bộ điều khiển Điều hướng theo lập trình, hoặc tôi có thể định nghĩa phân cấp khung nhìn trong IB một mình không? –

+0

GHI CHÚ: có vẻ như việc tạo Bộ điều khiển Điều hướng có nghĩa là tôi cũng phải cài đặt hệ thống phân cấp bộ điều khiển xem theo cách lập trình, và sau đó tôi sẽ tiếp tục với IB, bắt đầu với bộ điều khiển điều hướng xuống. –

+1

Bạn có thể tạo bộ điều khiển điều hướng và trình điều khiển chế độ xem gốc trong mã và tải chế độ xem cho trình điều khiển chế độ xem gốc trong IB. Nó sẽ không khó xử. Bạn cũng có thể tạo bộ điều khiển điều hướng và bộ điều khiển chế độ xem gốc trong một XIB riêng biệt từ chế độ xem của trình điều khiển chế độ xem gốc. XIB riêng biệt này thường là MainWindow.xib. Khi các tập tin MainWindow.xib được nạp hai bộ điều khiển xem sẽ được tạo ra. Khi trình điều khiển chế độ xem gốc cần xem lần đầu tiên, nó sẽ tải nó từ tệp XIB thứ hai. Đó là cách thông thường để làm điều này. –

0

Trong IB, trong thanh công cụ MenuController, hãy thêm UIView và đặt chế độ xem đó làm ổ cắm. Bạn sẽ cần đặt chế độ xem đó cho UIViewController. Here là liên kết nhanh đến trang Apple hiển thị thiết lập cơ bản. Không chắc chắn nếu nó sẽ giúp bạn ở giai đoạn hiện tại của bạn mặc dù.

+0

Sự cố là không có chế độ xem nào trong bộ điều khiển điều hướng của tôi để kết nối. Các ràng buộc là tôi muốn tách riêng từng ngòi ngách riêng lẻ, do đó, vấn đề của tôi là khái niệm hoặc định hướng thiết kế, không phải là vấn đề thực hiện. Cảm ơn mọi sự kiện. –

+0

Chế độ xem nào được đặt cho AnotherViewController? Có vẻ như đó là vấn đề. – Jordan

+0

AnotherViewController chỉ là một bộ điều khiển View nib với một cái nhìn duy nhất. Nó thậm chí không được nạp, mặc dù. Vấn đề xảy ra ở đâu đó trong vòng đời khi MenuController muốn xem, nhưng thay vì những gì tôi hy vọng sẽ được tự động truyền yêu cầu xuống các điều khiển, nó chỉ ném lỗi nói trên. Bởi câu trả lời của bạn, mặc dù, có vẻ như bạn đang ngụ ý một chủ sở hữu của nib không nhất thiết phải cần một nib. Đó có phải là sự hiểu biết của bạn không? –

1

Điểm mấu chốt của câu hỏi này được chính Travis tuyên bố: "Bạn sẽ tải nib điều khiển điều hướng như thế nào, thiết kế nhiều nhất có thể trong Bộ dựng giao diện?" Và cũng từ ví dụ, có vẻ như điều này có nghĩa là UINavigationController và UIViewControllers liên quan.

Với cách giải thích này, câu trả lời là bạn không thể cấu hình đầy đủ UINavigationController và nó là UIViewControllers trong một XIB đơn lẻ. Có nó là trực quan để muốn làm điều này, do đó bạn không điên.

Khi tôi nói bạn không thể làm điều này, tôi có nghĩa là các phương pháp khung phổ biến nhất được sử dụng không có cách nào để xử lý việc này. Không có [Cấp phát UINavigationController] initWithMegaNibName. Có, bạn có thể nhồi nhét hầu hết mọi thứ trong một XIB và viết mã để hydrate các đối tượng theo những cách đặc biệt, nhưng tôi không nghĩ đó là thứ bạn đang tìm kiếm. Bạn có thể sử dụng hai hay nhiều XIB như Jon gợi ý, nhưng sau đó mọi thứ ít tự chứa hơn và do đó bạn có nhiều người tìm thấy nó đơn giản hơn để làm một phần hoặc tất cả các bộ điều khiển trong mã.

Rất tiếc, không có sự tương ứng 1: 1 giữa khả năng của Trình tạo giao diện và mã như trên các nền tảng dev khác. Tôi thường thích để có thể cho phép các nhà thiết kế tham gia càng nhiều càng tốt trong việc tạo ra tài sản, nhưng hầu hết trong số họ tôi biết không mã mục tiêu-c.

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