2010-01-28 21 views
50

Từ các tài liệu chính thức:iPhone - ReuseIdentifiers (UITableViewCell) là gì?

Từ định tái sử dụng được liên kết với một đối tượng UITableViewCell rằng bảng điểm của đại biểu tạo ra với mục đích tái sử dụng nó như là cơ sở (vì lý do hiệu suất) cho nhiều hàng của một cái nhìn bảng . Nó được gán cho đối tượng ô trong initWithFrame: reuseIdentifier: và không thể thay đổi sau đó. Một đối tượng UITableView duy trì một hàng đợi (hoặc danh sách) của các ô hiện đang sử dụng lại, mỗi ô có mã định danh tái sử dụng riêng của nó và làm cho chúng có sẵn cho đại biểu trong phương thức dequeueReusableCellWithIdentifier:.

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

Tôi không hiểu điều này. Vâng, tôi hiểu ý tưởng cơ bản, tôi nghĩ rằng, bạn tạo ra UITableViewCells, và cố gắng tái sử dụng nhiều như bạn có thể thay vì làm những cái mới (hoặc một cái gì đó như thế). Nhưng những gì chính xác quyết định có hay không một tế bào có thể tái sử dụng? Nếu tôi có hai ô giống hệt nhau (trực quan), nhưng với các văn bản khác nhau (tôi cho rằng chúng không hoàn toàn giống nhau), chúng có thể có cùng một mã định danh không? Hay họ nên có những cái khác nhau? Hoặc trong tình huống nào bạn phải sử dụng các mã định danh khác nhau?

Có ai có thể làm rõ hoặc liên kết đến địa điểm của nó không?

Trả lời

65

Ok, đây là cách tôi tin rằng nó hoạt động:

Sử dụng dequeueReusableCellWithIdentifier cho tableView, bạn rất có thể điều tốc độ lên. Thay vì instantiating rất nhiều tế bào, bạn chỉ cần instantiate như nhiều khi cần thiết, tức là như nhiều người có thể nhìn thấy (điều này được xử lý tự động). Nếu di chuyển đến một khu vực trong danh sách có "ô" chưa có biểu diễn trực quan của chúng, thay vì khởi tạo mới, bạn đã sử dụng lại các ô hiện có.

Bạn có thể thử này chính mình bằng cách thực hiện điều này:

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

if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    NSLog(@"new one"); 
} 
else 
{ 
    NSLog(@"old one"); 
} 

Hãy nhớ rằng, bạn chỉ muốn dequeueReusableCellWithIdentifier để trả về một tế bào nếu nó được áp dụng. Vì vậy, nếu một tế bào sẽ được tái sử dụng, hãy chắc chắn rằng nó là chính xác cho tình hình. Đó là những gì reuseIdentifiers cho. Thông thường, bạn sẽ chỉ cần một. Nhưng có thể có một danh sách sử dụng nhiều loại ô khác nhau và trong trường hợp đó, bạn phải giữ chúng riêng biệt bằng cách cung cấp các trình tái sử dụng khác nhau. Nếu không, bạn có thể sẽ nhận được một ô mà bạn coi là một loại ô khác (ví dụ, ô UITableView thay vì ô tùy chỉnh mà bạn muốn). Vì vậy, về cơ bản, như tôi đã hiểu, hãy sử dụng các trình tái sử dụng khác nhau cho các loại ô khác nhau, trong đó loại có nghĩa là lớp học. Nếu bạn chỉ sử dụng các ô tiêu chuẩn, có thể bạn chỉ cần một reuseIdentifier.

Mẫu thiết kế này được gọi là object pooling.

+14

Tôi đã được phát triển iPhone trong một thời gian dài và ngại về câu trả lời này làm rõ chủ đề này rất nhiều. –

+0

Giải thích tuyệt vời :) – Karun

+0

Đối tượng gộp cụm từ chính xác một số tiền tối đa cho số – Shajo

10

Chỉ cần thêm một số điều cần quano là khác câu trả lời rất tốt: (Tôi đã thử để thêm video này như một bình luận, nhưng nó quá dài!)

Thậm chí tái sử dụng định danh có thể được bỏ qua trong việc phát triển, mặc dù điều này phải được được thực hiện trong những trường hợp rất cụ thể. Nếu bạn có một cái nhìn bảng 6-7 ô, và mỗi ô là khác nhau, bạn có thể thấy rằng việc tạo một ô mới với số không là số nhận dạng có thể thích hợp hơn.Có một tế bào tái sử dụng có nghĩa là trong mỗi lần cellForRowAtIndexPath được gọi, bạn phải kiểm tra ô, khởi tạo nó nếu không có ô tái sử dụng, và bên ngoài phạm vi init bạn phải lặp lại rõ ràng thông qua tất cả các đường dẫn có thể và thiết lập giá trị cho mỗi nhãn rõ ràng tùy thuộc vào loại tế bào bạn có! Vì vậy, trong chế độ xem bảng với 10 ô có sẵn, bạn sẽ phải quan tâm đến việc tạo ô nếu không có và điền vào tùy thuộc vào những gì bạn đã tạo. Vì vậy, trong trường hợp này, nó thích hợp hơn trong việc bảo trì mã để khởi tạo mỗi ô với mã định danh nil (vì nó sẽ không được sử dụng lại) và điền thông tin của mỗi ô một cách thích hợp mà không phải lo lắng về việc sử dụng lại nó.

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