2012-04-03 33 views
21

Sử dụng kịch bản, các tế bào tĩnh, trong cellForRowAtIndexPath: dòngtế bào Storyboard tĩnh: dequeueReusableCellWithIdentifier trả về nil

UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

luôn trả nil.

Tôi đã kiểm tra như sau:

  • nhận diện của tế bào được thiết lập một cách chính xác trong IB/Storyboard và tôi sử dụng cùng một định danh trong mã. Tôi đã xác minh điều này nhiều lần.
  • Tôi chưa khởi tạo bộ điều khiển chế độ xem ở nơi khác (đó là sự cố trong số this stackoverflow question).

điều khiển Quan điểm của tôi là một lớp con của UITableViewController, tất nhiên, bọc vào một quảng cáo hoc khiển hải trong kịch bản này. Nghi ngờ rằng bộ điều khiển xem của tôi bằng cách nào đó không biết về các số nhận dạng ô được xác định trong bảng phân cảnh vì nó có thể là một thể hiện khác, đây là mã "instantiates" nó. Trong prepareForSegue:, tôi sử dụng

CustomViewController *vc = [[[segue destinationViewController] 
    viewControllers] objectAtIndex:0]; 

các tùy chỉnh khác của bộ điều khiển xem thực hiện ở đây (thiết lập các thuộc vv) hoạt động tốt.

Tôi đang sử dụng ô tĩnh vì số lượng phần và hàng không thay đổi và mỗi ô chứa văn bản tĩnh (và các trường điều khiển hoặc trường văn bản khác cần chỉnh sửa).

Dường như với tôi đây là một nhiệm vụ rất phổ biến (tùy chỉnh các ô tĩnh từ bảng phân cảnh trong phương thức nguồn dữ liệu của bộ điều khiển chế độ xem). Tôi đang làm gì sai?

+0

Bạn sẽ phải cho chúng tôi biết nơi bạn thực sự xử lý việc tạo ô tùy chỉnh của mình. Đó là phần quan trọng. – borrrden

+0

Tôi tạo ô tùy chỉnh trong bảng phân cảnh. Nhập "Tùy chỉnh" và số nhận dạng ô của chính nó. Nó không hoạt động như thế sao? – Mundi

+0

Tôi đã bỏ lỡ toàn bộ phần tĩnh. Các ô tĩnh được thiết kế hoàn toàn trong bảng phân cảnh. xem phần 2 của hướng dẫn tuyệt vời này www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2 – borrrden

Trả lời

44

Với nội dung tĩnh trong chế độ xem bảng, bạn không triển khai bất kỳ phương pháp nguồn dữ liệu nào (bao gồm tableView:cellForRowAtIndexPath:, vì vậy bạn sẽ không bao giờ khử các ô. Không có bất kỳ nội dung tĩnh nào mà bạn có thể tham gia) .

Nếu bạn muốn có được một con trỏ đến một tế bào đặc biệt:

  • nhận được nó từ giao diện bảng sử dụng cellForRowAtIndexPath::

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    
  • có lối thoát tới ô cụ thể và tùy chỉnh trực tiếp.

  • Duyệt qua các tế bào và kiểm tra reuseIdentifier bất động sản để có được những tế bào mà bạn đang quan tâm.

Bất kỳ những điều này có thể được thực hiện trong viewWillAppear hoặc tương đương.

Nếu bạn muốn có nội dung hoàn toàn khác trong các ô của mình tìm thấy trên bảng phân cảnh thì các ô tĩnh có lẽ không phải là lựa chọn đúng. Bạn nên sử dụng các nguyên mẫu động (lưu ý bạn có thể có nhiều nguyên mẫu trong bảng phân cảnh) bằng các phương thức nguồn dữ liệu truyền thống thay thế.

+0

Cảm ơn - vì vậy đối với những gì tôi muốn làm điều đó có vẻ như tôi thực sự cần phải sử dụng các tế bào nguyên mẫu. Bạn có thể thêm nó vào câu trả lời của bạn, vì vậy tôi có thể kiểm tra nó? Cảm ơn bạn đã làm rõ! – Mundi

+0

Chỉnh sửa câu trả lời của tôi, bạn đã không thực sự nói những gì bạn đang cố gắng làm, vì vậy hy vọng nó sẽ giúp! – jrturton

+0

Tôi đang cố gắng để có nhãn tiêu đề tĩnh và trường văn bản có thể chỉnh sửa trong một số ô và một số điều khiển khác trong các ô khác. Tôi nghĩ bạn có thể điền dữ liệu vào các ô tĩnh. Số lượng hoặc vị trí của các ô không thay đổi. Tôi đã bắt đầu làm điều đó với các tế bào nguyên mẫu, và nó là rất nhiều công việc - gần như tồi tệ hơn trước khi bảng phân cảnh! – Mundi

0

Giải pháp là sử dụng các ô mẫu thử thay vì các ô tĩnh. Tôi vẫn đang kiểm tra @jrturton vì anh ấy là người đầu tiên đưa cho tôi ý tưởng.

Một lỗi thú vị khác mà tôi vừa giải quyết: với các ô mẫu loại "Tùy chỉnh", nếu bạn cố điền cell.textLabel với văn bản, nó sẽ tự động hoạt động, nhưng tất cả các bản xem trước khác của bạn hoạt động rất lạ. Tôi chỉ sử dụng nhãn tùy chỉnh của mình ngay bây giờ và mọi thứ đều hoạt động tốt.

Chúc mừng, cảm ơn mọi người đã giúp đỡ.

+0

bạn đã sử dụng ô "Tuỳ ​​chỉnh" như thế nào? vì dequeueReusableCellWithIdentifier trả về nil? –

+0

Bạn có thể chỉ định "Tùy chỉnh" trong Trình tạo giao diện. – Mundi

+0

Tôi đã chỉ định Custom trong Interface Builder, sau đó tôi phân lớp UITableViewCell và gán cho nó ô này. Nhưng nó mang lại các tế bào động rỗng. –

0

khác nhau để câu trả lời ở trên,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

sẽ không hoạt động. Nhưng phương pháp được đề cập để tạo ra một lối thoát cho chính mình là cell đang hoạt động.

Cũng có thể đặt các chế độ xem như UIButtons hoặc UITextFields trên cell và có các cửa hàng cho những người đó.

Cả hai phương pháp cũng có thể được sử dụng kết hợp. Ví dụ. đặt cell.textLabel.text cho một ô cụ thể và có một điều khiển khác sẽ được truy cập từ cửa hàng điều khiển.

0

Trong bảng phân cảnh, các ô tĩnh không thể triển khai các phương thức trong giao thức <UITableViewDataSource>.

Vì vậy, bạn có thể sử dụng các phương pháp được bao gồm trong <UITableViewDelegate>.

0

Bạn vẫn có thể sử dụng phương thức dataSource/delegate của static UITableView, bạn chỉ cần không phải tạo ô mới.

Nếu bạn muốn thay đổi các tế bào với các phương pháp dataSource, bên cellForRowAtIndexPath::

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

và sau đó bắt đầu thay đổi tế bào.

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