5

Chạy vào một cái gì đó thú vị, muốn biết nếu tôi đang làm điều gì sai hoặc nếu đây là hành vi đúng.Tự động tải XIB cho UITableViewController

Tôi có UITableViewController tùy chỉnh. Tôi giả định (sai lầm đầu tiên) rằng nếu bạn khởi tạo như vậy:

[[CustomTableController alloc] init]; 

nó sẽ tự động tải từ một XIB cùng tên, CustomTableController.xib, nếu nó là trong cùng thư mục và như vậy.

HOWEVER

Điều này không có tác dụng; không tải XIB. NHƯNG, nếu tôi thay đổi lớp cha của bộ điều khiển của tôi từ 'UITableViewController' thành 'UIViewController', MỌI TẤT CẢ THỰC HIỆN!

Calling:

[[CustomTableController alloc] init]; 

tải bộ điều khiển và xem từ xib của tôi.

Tôi có làm gì sai không? Đây có phải là một lỗi? Hành vi mong đợi?

Trả lời

26

Hầu hết các lớp trong Cocoa Touch liệt kê một "trình khởi tạo được chỉ định" mà bạn phải gọi từ các phương thức init khi bạn phân lớp chúng. Khi bạn tạo lớp tùy chỉnh của riêng mình, bạn nên kiểm tra tài liệu để tìm trình khởi tạo được chỉ định cho lớp cha của bạn. Khi bạn khởi tạo lớp bằng cách sử dụng một số trình khởi tạo khác từ một lớp cha tổng quát hơn (mà bạn đang thực hiện bằng cách gọi - [NSObject init] trong trường hợp này), bạn cướp lớp cha trực tiếp của cơ hội để khởi tạo đúng trạng thái của nó. Đôi khi bạn có thể thoát khỏi điều này. Thường thì bạn không thể.

Tài liệu của UIViewController cho biết trình khởi tạo được chỉ định là - initWithNibName:bundle:. Nếu bạn gọi phương thức này với nilName nil, nó sẽ tìm kiếm một ngòi phù hợp với tên lớp của bạn. Hành vi của -init không được cấp giấy phép cho UIViewController. Dựa trên hành vi bạn đang thấy, có vẻ như nó có thể đang gọi [self initWithNibName:nil bundle:nil], nhưng sẽ an toàn hơn khi gọi trực tiếp initWithNibName:bundle: thay vì dựa vào hành vi không có giấy tờ này.

UITableViewController chỉ xác định một trình khởi tạo duy nhất, -initWithStyle: (mặc dù nó không chỉ định phương thức này làm trình khởi tạo được chỉ định). Phương pháp này khởi tạo UITableViewController của bạn mà không cần sử dụng một nib, mà thường là tốt. Vì bạn không thêm subviews vào UITableView, thường không có nhiều thứ để đạt được bằng cách cấu hình UITableViewController của bạn thông qua một nib.

Nếu quyết định bạn muốn định cấu hình UITableViewController của mình qua nib, tài liệu cho chúng tôi biết rằng chúng tôi có thể bỏ qua an toàn -initWithStyle: và gọi phương thức initWithNibName:bundle: của UIViewController. Dưới đây là những gì các tài liệu hướng dẫn cho chúng ta biết về cách UITableView của chúng tôi và bộ điều khiển của nó sẽ được khởi tạo trong mỗi trường hợp:

  • Nếu một tập tin nib được xác định bằng phương pháp initWithNibName:bundle: (được tuyên bố bởi các UIViewController lớp cha), UITableViewController tải chế độ xem bảng được lưu trữ trong tệp nib. Nếu không, nó sẽ tạo ra một đối tượng UITableView chưa được định cấu hình với các kích thước chính xác và mặt nạ tự động hóa. Bạn có thể truy cập khung nhìn này thông qua thuộc tính tableView.

  • Nếu tệp nib chứa chế độ xem bảng được tải, nguồn dữ liệu và ủy nhiệm trở thành những đối tượng được xác định trong tệp nib (nếu có). Nếu không có tệp nib được chỉ định hoặc nếu tệp nib xác định không có nguồn dữ liệu hoặc đại biểu, UITableViewController đặt nguồn dữ liệu và đại biểu của chế độ xem bảng thành tự.

Nói tóm lại, các tài liệu hướng dẫn cho hầu hết các lớp cảm ứng Cocoa thể chỉ định một initializer định đơn lẻ hoặc một số ít các initializers rằng bạn có thể gọi một cách an toàn từ các lớp con của bạn. Luôn luôn tham khảo tài liệu cho lớp cha của bạn để tìm ra trình khởi tạo nào mà lớp con của bạn sẽ gọi.

+0

Câu trả lời hay, cảm ơn! Ước gì tôi có thể cho bạn thêm điểm. – ACBurk

+0

Ứng dụng của tôi bị treo khi tôi tạo một xib với UIView trong đó và một UITableView trong đó và cố gắng tải xib đó bằng initWithNibName như bạn mô tả. Nó phàn nàn "- [LoadView UITableViewController] tải" ngòi XXXXXXTableViewController "nhưng không nhận được một UITableView. ' Tôi cũng đã cố gắng làm cho xem gốc của xib chỉ là một UITableView, nhưng khi tôi làm điều đó các ứng dụng tải nhưng không có tùy biến tôi đã thực hiện cho bảng hiển thị trong ứng dụng.:/ –

+0

Tôi nghĩ rằng tôi đã phát điên khi nó có vẻ như nó đang tải nibs với cùng tên với lớp.Giải thích rất tốt – zekel

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