2012-02-05 27 views
18

Tôi muốn tạo UITableViewCell tùy chỉnh bằng cách sử dụng một XIB, nhưng tôi không chắc chắn làm thế nào để tái chế nó bằng cách sử dụng cơ chế xếp hàng của UITableViewController. Làm thế nào tôi có thể thực hiện điều này?Làm cách nào để tái chế các đối tượng UITableViewCell được tạo từ XIB?

Mọi người, câu hỏi này được dự định là tự trả lời theo the FAQ, mặc dù tôi thích câu trả lời tuyệt vời. Có một số upvotes, điều trị cho mình một ly bia. Tôi hỏi điều này bởi vì một người bạn hỏi tôi và tôi muốn đưa nó lên trên StackOverflow. Nếu bạn có bất cứ điều gì để đóng góp, bằng mọi cách!

Trả lời

51

Nếu bạn đang sử dụng iOS 5 bạn có thể sử dụng

[self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
              bundle:nil] 
    forCellReuseIdentifier:@"cellIdentifier"]; 

Sau đó, bất cứ khi nào bạn gọi:

cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 

tableview sẽ hoặc nạp nib và cung cấp cho bạn một tế bào, hoặc dequeue một tế bào cho bạn!

Ngòi bút chỉ cần là một ngòi bút với một khung nhìn được định nghĩa bên trong nó!

+3

Không biết về điều này. – Moshe

+2

Đó là một API mới được giới thiệu với iOS5 - đã sử dụng nó kể từ ngày tôi nhìn thấy nó - làm cho cuộc sống trở nên đơn giản! Bạn thậm chí có thể nâng cao hơn với nó bằng cách phân lớp UITableViewCell và thêm các thuộc tính IBOutlet trỏ đến các điều khiển khác nhau trong ô, vì vậy bạn thậm chí không cần sử dụng ViewWithTag nữa! –

+0

Tuyệt đối tuyệt vời! – Moshe

2

Tạo ngòi trống và thêm ô bảng làm mục đầu tiên. Trong thanh tra, bạn có thể thêm chuỗi reuseIdentifier trong Trình tạo giao diện.

Để sử dụng các tế bào trong mã của bạn, làm điều này:

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0]; 
    } 

    //set up cell 

    return cell; 
} 

Còn có một phương pháp mà bạn tạo ra một lối thoát cho di động của bạn và tải các ngòi di động bằng cách sử dụng bộ điều khiển là chủ sở hữu của tập tin, nhưng một cách trung thực này dễ dàng hơn nhiều.

Nếu bạn muốn có thể truy cập vào các bản xem trước bạn đã thêm vào ô trong ngòi bút, hãy cung cấp cho họ các thẻ duy nhất và truy cập chúng với [ô xemWithTag: x];

Nếu bạn muốn có thể đặt thuộc tính tùy chỉnh trên ô, bạn sẽ cần tạo lớp con UITableViewCell tùy chỉnh, sau đó chỉ cần đặt làm lớp của ngòi trong InterfaceBuilder và truyền UITableViewCell vào lớp con tùy chỉnh của bạn khi bạn dequeue nó trong đoạn code trên.

1

đây làm thế nào bạn có thể làm:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName]; 
    if (!cell) 
    { 
    NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil]; 
    cell = [topLevelItems objectAtIndex:0]; 
    } 

    return cell; 
} 

đâu cellLoader trong .h được định nghĩa như sau:

UINib *cellLoader; 

và trong .m được istantiated như sau (ví dụ trong quá trình khởi):

cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain]; 

CellClassName được định nghĩa bằng .m như sau (là als o tên cho xib của bạn).

static NSString *CellClassName = @"YourCustomeCell"; 

Đừng quên sử dụng chuỗi CellClassName cũng trong xib bạn tạo tế bào.

Để biết thêm thông tin, tôi khuyên bạn nên đọc hướng dẫn tuyệt vời này creating-a-custom-uitableviewcell-in-ios-4.

Hy vọng điều đó sẽ hữu ích.

P.S. Tôi khuyên bạn nên sử dụng UINib vì là một phương pháp được tối ưu hóa để tải các tệp xib.

2

Để thiết lập một tùy chỉnh UITableViewCell sử dụng một XIB, bạn phải làm một vài điều:

  • Thiết lập một IBOutlet trong tiêu đề của bạn
  • Cấu hình các tế bào xem bảng trong Interface Builder
  • Nạp XIB bên trong tableView:cellForRowAtIndexPath:
  • Cấu hình nó giống như bất kỳ tế bào khác

Vì vậy ... Hãy thiết lập một IBOutlet trong tệp tiêu đề.

@property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell; 

Đừng quên tổng hợp nó bên trong tệp triển khai.

@synthesize dvarTorahCell; 

Bây giờ, hãy tạo và định cấu hình ô. Bạn muốn chú ý đến các Identifier di động và IBOutlet như hình dưới đây:

enter image description here

Bây giờ trong mã, bạn tải lên XIB vào di động của bạn như thể hiện ở đây:

enter image description here

Lưu ý rằng Số nhận dạng di động trong Trình tạo giao diện khớp với mã nhận dạng được hiển thị trong mã bên dưới.

Sau đó, bạn tiếp tục và định cấu hình ô của mình như bất kỳ ô nào khác.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) { 

    [[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil]; 
    cell = dvarTorahCell; 
    dvarTorahCell = nil; 
} 

//configure your cell here. 

Chỉ cần lưu ý khi truy cập vào subviews, chẳng hạn như nhãn, bây giờ bạn cần phải tham khảo chúng bằng thẻ, thay vì bằng tên thuộc tính, chẳng hạn như textLabeldetailTextLabel.

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