2012-03-22 9 views
7

Trong ứng dụng iOS, chúng tôi phải đăng ký các tệp nib với chế độ xem bảng của chúng tôi trước khi chúng tôi có thể sử dụng UITableView#dequeueReusableCellWithIdentifier.Làm cách nào để kiểm tra xem một mã định danh tái sử dụng đã được đăng ký với UITableView chưa?

Ví dụ:

static NSString *myReuseIdentifier = @"MyReuseIdentifier"; 
UINib *cellNib = [UINib nibWithNibName:myReuseIdentifier bundle:nil]; 
[self.tableView registerNib:cellNib forCellReuseIdentifier:myReuseIdentifier]; 

Có cách nào để kiểm tra xem một NIB đã được đăng ký với một UITableView?

Tôi có một ô tùy chỉnh mà tôi sử dụng trong các bảng khác nhau trên một số bộ điều khiển trong ứng dụng của mình. Tôi muốn di chuyển một số mã vào một macro. Một cái gì đó như

-(CustomCell *)customCell:(UITableView *)tableView 
{ 
    static NSString *reuseIdentifier = @"MyReuseIdentifier"; 
    if (![table hasAlreadyRegisteredNib:reuseIdentifier]){ 
     UINib *cellNib = [UINib nibWithNibName:reuseIdentifier bundle:nil]; 
     [self.tableView registerNib:cellNib forCellReuseIdentifier:reuseIdentifier];  
    } 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    return cell; 
} 
+0

Tại sao bạn không đăng ký ngòi ngách của mình trong phương thức viewDidLoad? – JiaYow

+0

Bởi vì tôi muốn gắn điều này vào macro được chia sẻ trên một số bộ điều khiển – bodacious

+0

Nhưng vì bạn có nhiều bảng khác nhau, bạn phải đăng ký nib cho mỗi bảng. –

Trả lời

4

Tôi không chắc chắn nếu nó rằng những gì bạn có ý định, nhưng

-dequeueReusableCellWithIdentifier: 

lợi nhuận nil nếu ô chưa sẵn sàng để tái sử dụng. Nếu không, nó sẽ trả về ô, vì vậy bạn có thể chỉ cần thử.

+0

Mẹo tuyệt vời! Vì vậy, tôi có thể kiểm tra xem các tế bào là nil, nếu như vậy tôi đăng ký Nib với bảng và sau đó trở lại các tế bào! cảm ơn – bodacious

+0

Hãy cẩn thận khi tùy thuộc vào nil để đăng ký NIB trên iOS 5. Có lỗi khi VoiceOver được bật: Trong trường hợp này, nó luôn trả về 0. Vì vậy, bạn sẽ kết thúc trong một vòng lặp vô hạn đăng ký vòng lặp. Chi tiết hơn: http://stackoverflow.com/a/13881778/235297 –

0

Tôi tin rằng điểm registerNib:forCellReuseIdentifier: là giảm mã boilerplate. Có thể bạn chỉ cần gọi điều này một lần trong phương thức viewDidLoad của mình?

+0

Tôi đã cố gắng tránh lặp lại cùng một mã trên nhiều bộ điều khiển - tôi đã viết macro này dưới dạng macro – bodacious