2012-02-17 38 views
36

Tôi đang chuyển đổi sang iOS 5 và bảng phân cảnh. Khi tôi có chế độ xem bảng với kiểu ô mặc định, mọi thứ đều hoạt động tốt.Cách khởi tạo ô bảng kiểu mẫu tùy chỉnh trong bảng phân cảnh iOS 5?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyIdentifierFromStoryboard"]; 
    } 
    return cell; 
} 

Tôi đã xem các ví dụ trong đó khối "if (cell == nil)" bị xóa. Tuy nhiên nếu tôi lấy nó ra, ứng dụng của tôi treo với thông báo: "UITableView dataSource phải trả về một ô từ tableView: cellForRowAtIndexPath:". Đây không phải là một vấn đề bởi vì nó hoạt động như được hiển thị ở trên.

Vấn đề của tôi là tôi muốn sử dụng kiểu tùy chỉnh cho ô và do đó không thể sử dụng initWithStyle. Làm thế nào để khởi tạo một ô tùy chỉnh mà tôi đã thiết kế trên bảng phân cảnh?

Ứng dụng cũ trước 5 có một ngòi và lớp đã sử dụng một cái gì đó như thế này, nhưng bây giờ tôi đang sử dụng bảng phân cảnh.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomTableCell *cell = (MyCustomTableCell *) [tableView dequeueReusableCellWithIdentifier:@"MyCustomIdentifier"]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomTableCell" owner:self options:nil]; 
     cell = (MyCustomTableCell *) [nib objectAtIndex:0]; 
    } 
    return cell; 
} 
+0

nếu bạn vẫn cố gắng sử dụng Nib này làm TableViewCell tùy chỉnh thì sao? – onmyway133

Trả lời

39

Bằng cách này

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

    return cell; 
} 
+8

Kết quả trong ô có kiểu mặc định chứ không phải kiểu tùy chỉnh từ bảng phân cảnh. –

+3

heres và ví dụ http://www.techotopia.com/index.php/Using_Xcode_Storyboards_to_Build_Dynamic_TableViews_with_Prototype_Table_View_Cells – Alex

+0

tôi đoán rằng hoạt động .. – Alex

0

Tôi nghĩ cái này hoạt động rất tốt. Tôi đã cố gắng để có được đầu của tôi xung quanh nó cho đôi khi và cảm ơn nó đã làm việc .. tốt tôi đã làm điều này, khi cố gắng để phân bổ một tế bào tôi đã được phân bổ bằng cách sử dụng lớp tế bào chung thay vì một tôi đã tạo ra

vì vậy tôi đã làm điều này, do đó, thats lý do tại sao nó không làm việc

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

nên thay vì UITableViewCell alloc tế bào với lớp học của bạn, tốt với các ví dụ trên "CustomCell"

Cảm ơn một lần nữa

8

Nếu bạn tải bộ điều khiển xem của bạn ntains tableview sử dụng:

MyViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 

Sau đó bên cellForRowAtIndexPath bạn chỉ cần một dòng:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"]; 

dequeueReusableCellWithIdentifier sẽ nhanh chóng một tế bào nếu có không tồn tại.

+4

Đây phải là câu trả lời được chấp nhận theo như tôi có thể nói. Kiểm tra cho các tế bào nil vv là boilerplate vô ích khi sử dụng storyboards. – powerj1984

9

này làm việc hoàn hảo đối với tôi (Xcode 4.5.2 và iOS 6.0):

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

    if(cell == nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 
    } 

    UILabel *title = (UILabel*) [cell viewWithTag:1000]; 
    UILabel *summary = (UILabel*) [cell viewWithTag:1001]; 
    [title setText:[ tableMainTitle objectAtIndex:indexPath.row]]; 
    [summary setText:[ tableSubTitle objectAtIndex:indexPath.row]]; 
    return cell; 
} 

Quan trọng: Đừng quên thiết lập đại biểu và nguồn dữ liệu.

+4

Đối với iOS6 với bảng phân cảnh, ô không bao giờ là không sau khi khử. – mskw

+1

@mskw để một ô sẽ luôn hợp lệ và có thể sử dụng được? hoặc họ có một số phương pháp khác để xác định các tế bào không hợp lệ (như một hằng số hoặc một cái gì đó) – twinlakes

+1

Cho bạn có số nhận dạng chính xác có. Nếu không nó sẽ sụp đổ phàn nàn về nó. – mskw

0
static NSString *[email protected]"SearchUser"; 
SearchUserCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier]; 
if (cell==nil) 
{ 
    cell=[[SearchUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 
} 
return cell; 
+1

Vậy mã đó có nghĩa là gì? Một số bình luận sẽ giúp. –

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