2012-03-06 7 views
5

Tôi đang sử dụng bảng phân cảnh ios5 với UITableViewController có lớp con UITableViewCell. Tôi không muốn thiết kế các phần tử trực quan của ô trong trình thiết kế bảng phân cảnh cho khung nhìn, vì tôi muốn sử dụng một lớp con có thể sử dụng lại của UITableViewCell (cụ thể là TDBadgedCell).dequeueReusableCellWithIdentifier không trả lại ô của loại tùy chỉnh của tôi

Tôi đã đặt số nhận dạng ô trong trình thiết kế bảng phân cảnh và tất cả các hàng tải chính xác trong UITableView miễn là tôi không đặt bất kỳ thuộc tính nào duy nhất cho TDBadgedCell. Nếu tôi đặt thuộc tính badgeString mặc dù đó là duy nhất cho TDBadgedCell, tôi nhận được một ngoại lệ. Tôi thu hẹp lại rằng dequeueReusableCellWithIdentifier: không trả về một ô thuộc loại TDBadgedCell.

Tôi chỉ chạy với điều này bằng UITableViewController. Tôi có một UIViewController với một UITableView nhúng thiết lập trong cùng một thời trang và nó không phải là một vấn đề. Bất kỳ ý tưởng?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
static NSString *CellIdentifier = @"PhoneNumberCell"; 
TDBadgedCell *cell = (TDBadgedCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

if ([cell isKindOfClass:[TDBadgedCell class]]) 
{ 
    NSLog(@"It is TDBadgedCell"); 
} 
else 
    NSLog(@"It is NOT TDBadgedCell"); 
+6

bạn cũng đã thay đổi "Lớp tùy chỉnh" thành TDBadgedCell trong trình thiết kế bảng phân cảnh chưa? – fengd

+0

có thể trùng lặp của [Prototype Cells in a nib thay vì bảng phân cảnh] (http://stackoverflow.com/questions/8574188/prototype-cells-in-a-nib-instead-of-a-storyboard) - chỉ có thể, Tôi không chắc chắn nếu bạn có một xib riêng biệt cho tế bào này hay không. – jrturton

+0

June1st - Đó là nó! Cảm ơn! Tôi không chắc chắn làm thế nào để đánh dấu câu trả lời của bạn như là câu trả lời mặc dù. – scubasteve

Trả lời

0

Tôi gặp vấn đề tương tự khi tôi phân lớp UITableViewCell nhưng không sử dụng bảng phân cảnh. Đây là giải pháp của tôi để sử dụng các lớp tế bào khác nhau phụ thuộc vào nếu người dùng đã mua tính năng mở khóa của ứng dụng. Hy vọng nó sẽ giúp ai đó.

Tóm lại, tôi đã có ô với một số đối tượng bao gồm đối tượng UITextView. Tôi muốn khóa tính năng sao chép và dán của đối tượng UITextView trong phiên bản lite nhưng sau đó phát hành tính năng khi người dùng đã mua trong sản phẩm trong ứng dụng.

Tôi đã có hai lớp UITableViewCell, một với UITextView vì nó là và một với UITextView được phân lớp với canBecomeFirstresponder trả về NO. Bằng cách đó, người dùng vẫn có thể cuộn lên và xuống dữ liệu UITextview nhưng không sao chép và dán dữ liệu.

Đây là mã và tất cả những gì tôi phải làm là đổi tên số nhận dạng sử dụng lại.

TẠI SAO? Bởi vì [self.tableview reloadData] sẽ không xây dựng lại các ô với lớp mới vì ô vẫn còn tồn tại. Các tế bào mới tắt màn hình sẽ có được lớp mới nhưng những cái hiện tại sẽ không. Giải pháp này xây dựng lại tất cả các ô một lần sau khi mua mở khóa tính năng được thêm vào.

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


if (your test if in-app was purchased is yes) 
{ 
static NSString *MyIdentifier = @"MyCell"; 

FrontCell *cell = (FrontCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

if (cell == nil) 
     { 
     cell = [[FrontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

//....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; 
} 
else // inapp not purchased 
{ 
    static NSString *MyLockedIdentifier = @"MyLockedCell"; 

    FrontCellLocked *cell = (FrontCellLocked *)[tableView dequeueReusableCellWithIdentifier:MyLockedIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[FrontCellLocked alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyLockedIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

    //....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; } 
} 
0

Trong bảng phân cảnh, bạn có thể đặt thuộc tính Lớp tùy chỉnh cho lớp con của UITablviewCell.
Sau đó phương thức dequeueReusableCellWithIdentifier sẽ trả về ô với loại lớp con của bạn.

0

Tôi nghĩ bạn đang sử dụng phương pháp sai để khử các ô.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [self.tblProfileInfo dequeueReusableCellWithIdentifier:@"PostCell" forIndexPath:indexPath]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    return cell; 

} 

Bạn quên indexPath ở cuối.

+0

Thử thay đổi "TDBadgedCell * cell = (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier];" tới "TDBadgedCell * cell = (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath];" –