2012-11-14 24 views
9

Tôi đang tạo ô theo chương trình bằng cách sử dụng mã định danh tái sử dụng.dequeueReusableCellWithIdentifier luôn trả về nil (không sử dụng bảng phân cảnh)

Note - Tôi không sử dụng kịch bản để tạo các tế bào

Bất cứ khi nào các tế bào được dequeued, các tế bào là con số không, vì vậy các tế bào cần được mới được tạo ra sử dụng alloc, đó là tốn kém.

EDIT (bổ sung thêm 1 câu hỏi và điều chỉnh đang)

Câu hỏi

  • Tại sao dequeue này luôn trở lại con số không? Làm thế nào tôi có thể sửa nó?
  • Công thức khử chỉ hoạt động khi được sử dụng cùng với bảng phân cảnh/tệp nib?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if(!cell) //Every time cell is nil, dequeue not working 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    } 

    return cell; 
} 
+2

Tần suất chính xác trở lại là không? Và bao nhiêu ô trong số đó được hiển thị đồng thời trên màn hình thiết bị của bạn? Việc tái sử dụng có nghĩa là chỉ tái sử dụng những ô đó, mà chỉ được cuộn ra khỏi màn hình. –

+0

Và Srikar là đúng. Số nhận dạng ô thích hợp phải được đặt trên các ô mới được tạo. –

+0

Nó trả về nil luôn. 4 ô được hiển thị tại một thời điểm nhất định và khi tôi di chuyển dequeue trả về 0. – user1046037

Trả lời

11

tôi đã thực hiện một vài sai lầm:

  1. Tôi đã sử dụng một lớp con của UITableViewController, nhưng đã tạo ra tableView bên ngoài của lớp con
  2. Có một tableView tạo trong giao diện bảng bộ điều khiển, là self.tableView Trong bộ điều khiển xem bảng trong khi trả lại ô cho đường dẫn chỉ mục, tôi đã sử dụng self.tableView thay vì tableView.
  3. Ngoài ra, đảm bảo rằng các nhận dạng tế bào được khai báo là static

    static NSString *CellIdentifier = @"Cell"; 
    
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    

Kể từ tableViewself.tableView được đại diện cho các bảng khác nhau, các tế bào không được dequeued từ cùng một bảng và do đó luôn nil

+0

Điểm 3 là trường hợp của tôi và hiện đã được giải quyết. Cảm ơn – NeverHopeless

+0

Điểm 2. Để loại bỏ hoàn toàn sự mơ hồ, tôi đặt tên 'tableView' trong' nib' thành 'mTableView'. – Jacksonkr

11

Bạn cần phải đầu tiên thiết lập các CellIdentifier như Cell. Bạn đang làm điều đó? Khi bạn đang tạo một ô mới, bạn cần gán mã định danh này Cell cho nó. chỉ khi đó iOS mới có thể dequeueReusableCellWithIdentifier với số nhận dạng đó. Programatically bạn có thể làm điều đó như vậy -

UITableViewCell *cell = [[UItableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; 

Bạn có thể thiết lập định danh từ Interface Builder quá -

enter image description here

+1

Tôi không sử dụng bảng phân cảnh, tôi đang tạo ô theo chương trình. Vì vậy, tôi không nghĩ rằng giải pháp này có thể được áp dụng. chính xác tôi nếu tôi sai – user1046037

+0

hey người đàn ông tôi cung cấp các giải pháp cho cả hai. Vui lòng đọc câu trả lời đúng cách. đầu tiên tôi đưa ra giải pháp lập trình sau đó vì mục đích hoàn chỉnh, cung cấp giải pháp IB. –

+0

xin lỗi về điều đó, NSString CellIdentifier được đặt là @ "Cell". Lưu ý mã ban đầu đã được cập nhật ngay bây giờ. Tôi đang làm điều đó, nó hiện diện trong mã mà tôi đã dán. Bạn có thể cho tôi biết nếu tôi thiếu cái gì đó. Vẫn không làm việc. – user1046037

2

Mã này sẽ được tạo ra cảnh báo "kiểm soát đạt hết chức năng không trống" bởi vì bạn không thực sự trở lại bất cứ điều gì. Thêm return cell; vào cuối hàm. Ngoài ra, bạn không bao giờ thêm số nhận dạng sử dụng lại vào các ô mới được tạo.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell";  
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if(cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    return cell; 
} 
+0

trong khi dán mã tôi đã bỏ lỡ một vài dòng, bây giờ tôi đã chỉnh sửa và cập nhật. Mã bạn dán là những gì tôi đang sử dụng. Tuy nhiên, nó trả về nil mỗi lần. – user1046037

1

Khai báo đầu tiên số nhận dạng ô cho tableViewCell tại viewDidLoad phương pháp như:

[tableView registerClass:UITableViewCell.class forCellReuseIdentifier:@"MyCell"]; 

Bây giờ nhớ lại trường hợp của các UITableViewCell với cùng định danh "MyCell" như:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath]; 

Tiếp tục chỉ lấp đầy các tế bào .. Bây giờ Logic thực hiện rằng số lượng hạn chế các tế bào có thể hiển thị danh sách rất lớn một cách hiệu quả (sử dụng khái niệm dequeue).

Nhưng hãy nhớ để gán giá trị (thậm chí nil nếu được yêu cầu) cho mọi UIView được sử dụng trong ô, nếu không ghi đè/chồng chéo văn bản/hình ảnh sẽ xảy ra.

+0

Đây thực sự là câu trả lời đúng – SomaMan

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