Theo tôi hiểu, bạn muốn:
- Thiết kế một ô trong IB có thể được sử dụng trong nhiều cảnh phân cảnh.
- Định cấu hình các phân cảnh bảng phân cảnh duy nhất từ ô đó, tùy thuộc vào cảnh mà ô đó nằm trong.
Thật không may, hiện tại không có cách nào để làm điều này. Để hiểu lý do tại sao các lần thử trước của bạn không hoạt động, bạn cần hiểu thêm về cách các bảng phân cảnh và các ô xem bảng nguyên mẫu hoạt động. (Nếu bạn không quan tâm đến lý do tại sao những nỗ lực khác này không hoạt động, hãy thoải mái rời đi ngay bây giờ. Tôi không có cách giải quyết kỳ diệu nào cho bạn, ngoài việc đề nghị bạn nộp lỗi.)
Một bảng phân cảnh về bản chất là không nhiều hơn một tập hợp các tệp .xib. Khi bạn tải lên một bộ điều khiển xem bảng có một số ô nguyên mẫu từ bảng phân cảnh, đây là điều xảy ra:
- Mỗi tế bào nguyên mẫu thực sự là mini-nib nhúng của riêng nó. Vì vậy, khi trình điều khiển xem bảng đang tải lên, nó sẽ chạy qua từng ngòi và cuộc gọi của ô nguyên mẫu
-[UITableView registerNib:forCellReuseIdentifier:]
.
- Khung nhìn bảng yêu cầu bộ điều khiển cho các ô.
- Bạn có thể gọi
-[UITableView dequeueReusableCellWithIdentifier:]
Khi bạn yêu cầu một ô có mã định danh tái sử dụng nhất định, nó sẽ kiểm tra xem nó có đăng ký ngòi hay không. Nếu có, nó khởi tạo một thể hiện của ô đó. Điều này bao gồm các bước sau:
- Nhìn vào lớp của ô, như được định nghĩa trong ngòi của ô. Gọi
[[CellClass alloc] initWithCoder:]
.
- Các
-initWithCoder:
phương pháp đi qua và cho biết thêm subviews và bộ thuộc tính đã được định nghĩa trong nib. ( IBOutlet
có lẽ cũng bị mắc kẹt ở đây, mặc dù tôi đã không kiểm tra điều đó; nó có thể xảy ra trong -awakeFromNib
)
Bạn cấu hình ô của bạn theo cách bạn muốn.
Điều quan trọng cần lưu ý ở đây là có sự phân biệt giữa lớp của tế bào và sự xuất hiện trực quan của tế bào. Bạn có thể tạo hai ô nguyên mẫu riêng biệt của cùng một lớp, nhưng với các ô của chúng được đặt hoàn toàn khác nhau. Trong thực tế, nếu bạn sử dụng các UITableViewCell
kiểu mặc định , đây chính xác là những gì đang xảy ra. Ví dụ, kiểu "Mặc định" và kiểu "Phụ đề" đều được đại diện bởi cùng một UITableViewCell
lớp.
Điều này rất quan trọng : Lớp của ô không có mối tương quan một-một với phân cấp khung nhìn cụ thể . Hệ thống phân cấp khung nhìn được xác định hoàn toàn bởi những gì trong ô nguyên mẫu đã được đăng ký với bộ điều khiển cụ thể này.
Cũng lưu ý rằng, định danh tái sử dụng của tế bào không được đăng ký trong một số phòng cấp phát tế bào toàn cầu. Mã định danh tái sử dụng chỉ được sử dụng trong ngữ cảnh của một UITableView
thể hiện duy nhất .
Đưa ra thông tin này, chúng ta hãy xem những gì đã xảy ra trong những nỗ lực trên của bạn.
Trong Bộ điều khiển số 1, đã thêm một ô nguyên mẫu, đặt lớp thành lớp con UITableViewCell của tôi, đặt id sử dụng lại, thêm nhãn và nối chúng với các ổ cắm của lớp. Trong Trình điều khiển # 2, đã thêm một ô nguyên mẫu trống, đặt nó vào cùng một lớp và sử dụng lại id như trước. Khi nó chạy, các nhãn không bao giờ xuất hiện khi các ô được hiển thị trong Bộ điều khiển # 2. Hoạt động tốt trong Bộ điều khiển # 1.
Điều này được mong đợi. Mặc dù cả hai ô có cùng một lớp, nhưng hệ thống phân cấp khung nhìn được truyền đến ô trong Bộ điều khiển # 2 hoàn toàn không có các bản xem xét. Vì vậy, bạn có một ô trống, đó chính xác là những gì bạn đặt trong nguyên mẫu.
Được thiết kế mỗi loại tế bào trong một NIB khác nhau và được nối với lớp tế bào thích hợp. Trong bảng phân cảnh, đã thêm một ô nguyên mẫu trống và đặt lớp của nó và sử dụng lại id để tham chiếu đến lớp ô của tôi. Trong các phương thức viewDidLoad của bộ điều khiển, đã đăng ký các tệp NIB đó cho id sử dụng lại. Khi được hiển thị, các ô trong cả hai bộ điều khiển đều trống như nguyên mẫu.
Một lần nữa, điều này được mong đợi. Mã định danh tái sử dụng không được chia sẻ giữa các cảnh trong truyện hoặc ngòi, vì vậy thực tế là tất cả các ô riêng biệt này có cùng định danh tái sử dụng là vô nghĩa. Ô bạn nhận được từ bảng xem sẽ có giao diện khớp với ô nguyên mẫu trong cảnh đó của bảng phân cảnh.
Giải pháp này đã gần, mặc dù. Như bạn đã lưu ý, bạn chỉ có thể gọi theo chương trình -[UITableView registerNib:forCellReuseIdentifier:]
, chuyển qua ô UINib
chứa và bạn sẽ lấy lại cùng một ô đó. (Điều này không phải vì nguyên mẫu đã "ghi đè" ngòi bút không có cách nào để nối các bảng phân cảnh vào một ô trong một ngòi độc lập.
Giữ nguyên mẫu trong cả hai bộ điều khiển trống và đặt lớp và sử dụng lại id cho lớp ô của tôi. Xây dựng giao diện người dùng của các tế bào hoàn toàn trong mã. Các tế bào hoạt động hoàn hảo trong tất cả các bộ điều khiển.
Một cách tự nhiên. Hy vọng, điều này là không ngạc nhiên.
Vì vậy, đó là lý do tại sao nó không hoạt động. Bạn có thể thiết kế các ô của mình trong các ngòi độc lập và sử dụng chúng trong nhiều cảnh phân cảnh; hiện tại bạn không thể nối các bảng phân cảnh vào các ô đó. Tuy nhiên, hy vọng rằng bạn đã học được điều gì đó trong quá trình đọc này.