0

i have made a demo which defines tableview in levels where section is only 1 but rows are defined according to levels. how can i set custom cell at cellforRowAtIndexPath level wise. This code works smooth when run without using CustomCell. but when i include customCell for particular level. THe Error like "[CustomCell txtAddress]not recognized as a selector" occurs. this only happens when i scroll the tableview. In precise words the app crashes.

My Code is as follows:

  - (void)viewDidLoad

{
[super viewDidLoad];
arraylist = [[NSMutableArray alloc]init];
array5 = [[NSMutableArray alloc]init];
array1 = [[NSMutableArray alloc]init];
objects = @[@"Medical Services In Chicago",@"Medical Services On Campus"];
arrObjectValueChicago = @[@"Ronald McDonald® Children's Hospital of Loyola",@"Burn Centers",@"Gottlieb Hospitals"];
arrObjectValueCampus = @[@"Cardinal Bernardin Cancer Center1",@"Center for Heart & Vascular Medicine2"];
for (int i =0; i< [arrObjectValueCampus count]; i++) {
    dictListCampus1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"2",@"level",[arrObjectValueCampus objectAtIndex:i],@"name", nil];
    [array5 addObject:dictListCampus1];
}
NSDictionary *dictListCampus = [[NSDictionary alloc]initWithObjectsAndKeys:@"Wellness Centers",@"name",@"1",@"level",array5,@"Objects",nil];
NSMutableArray *array6 = [[NSMutableArray alloc]initWithObjects:dictListCampus, nil];
array3 = [[NSMutableArray alloc]init ];
for(int i = 0; i<[arrObjectValueChicago count];i++){
       dictList3 = [[NSDictionary alloc]initWithObjectsAndKeys:@"2",@"level",     [arrObjectValueChicago objectAtIndex:i],@"name", nil];
     [array3 addObject:dictList3];
}

        NSDictionary *dictList2 = [[NSDictionary    alloc]initWithObjectsAndKeys:@"Hospitals",@"name",@"1",@"level",array3,@"Objects",nil];
NSMutableArray *array2 = [[NSMutableArray alloc]initWithObjects:dictList2, nil];
for (int i =0; i<[objects count]; i++) {
    if (i == 0) {
        dictionary =[[NSDictionary alloc]initWithObjectsAndKeys:[objects objectAtIndex:0],@"name",@"0",@"level",array2,@"Objects", nil];
        [array1 addObject:dictionary];
    }
    else if (i == 1)
    {
        dictionary =[[NSDictionary alloc]initWithObjectsAndKeys:[objects objectAtIndex:1],@"name",@"0",@"level",array6,@"Objects", nil];
        [array1 addObject:dictionary];
    }


  }
        dictList = [[NSDictionary alloc]initWithObjectsAndKeys:array1,@"Objects", nil];
        arrayOriginal = [dictList valueForKey:@"Objects"];
        [arraylist addObjectsFromArray:arrayOriginal];
  }





#pragma mark - TableView
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
   return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return [arraylist count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
       NSUInteger indentLevel = [[[arraylist    objectAtIndex:indexPath.row]valueForKey:@"level"]intValue];

        CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier: [CustomCell reuseIdentifier]];
if (cell == nil) {
    [[NSBundle mainBundle]loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = self.cells;
    self.cells = nil;
}
if (indentLevel == 0) {
    cell.lblHeader.text = [[arraylist objectAtIndex:indexPath.row]valueForKey:@"name"];
    cell.lblSubHeader.hidden = YES;
    cell.imgSubHeader.hidden = YES;
    cell.txtAddress.hidden = YES;
    cell.btnarrow.hidden= YES;
    cell.btnCall.hidden = YES;
    cell.btnCallNumber.hidden = YES;
    cell.btnHome.hidden = YES;
    cell.btnHomeAddress.hidden = YES;
    cell.btnUrl.hidden = YES;
    cell.imgline.hidden = YES;
    return cell;
}
else if (indentLevel == 1) {
    cell.lblSubHeader.text = [[arraylist objectAtIndex:indexPath.row]valueForKey:@"name"];
    cell.lblHeader.hidden = YES;
    cell.imgHeader.hidden = YES;
    cell.txtAddress.hidden = YES;
    cell.btnCall.hidden = YES;
    cell.btnCallNumber.hidden = YES;
    cell.btnHome.hidden = YES;
    cell.btnHomeAddress.hidden = YES;
    cell.btnUrl.hidden = YES;
    cell.imgline.hidden = YES;
    return cell;

}
else if (indentLevel == 2) {
    cell.txtAddress.text = [[arraylist objectAtIndex:indexPath.row]valueForKey:@"name"];
    cell.lblHeader.hidden = YES;
    cell.btnarrow.hidden= YES;
    cell.imgHeader.hidden = YES;
    cell.lblSubHeader.hidden = YES;
    cell.imgSubHeader.hidden = YES;
    return cell;

}
[cell setIndentationLevel:[[[arraylist objectAtIndex:indexPath.row]valueForKey:@"level"]intValue]] ;
return cell;
}


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tblist deselectRowAtIndexPath:indexPath animated:YES];

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:  [CustomCell reuseIdentifier]];
   NSUInteger indentLevel = [[[arraylist objectAtIndex:indexPath.row]valueForKey:@"level"]intValue];

  if (indentLevel == 1) {

    [cell.btnarrow setImage:[UIImage imageNamed:@"dwn1_arow.png"] forState:UIControlStateNormal];
    [cell.imgSubHeader setImage:[UIImage imageNamed:@"tab_active.png" ]];

}
   NSDictionary *d = [arraylist objectAtIndex:indexPath.row];
if ([d valueForKey:@"Objects"] ) {
    NSArray *ar = [d valueForKey:@"Objects"];
    BOOL isAlreadyInserted = NO;
    for(NSDictionary *dInner in ar ){
        NSInteger index=[arraylist indexOfObjectIdenticalTo:dInner];
        isAlreadyInserted=(index>0 && index!=NSIntegerMax);
        if(isAlreadyInserted) break;
    }
    if(isAlreadyInserted) {
        [self miniMizeThisRows:ar];
    } else {
        NSUInteger count=indexPath.row+1;
        NSMutableArray *arCells=[NSMutableArray array];
        for(NSDictionary *dInner in ar ) {
            [arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]];
            [arraylist insertObject:dInner atIndex:count++];
        }
        [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationNone];
    }

     }

 }
  -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 {
            NSUInteger indentLevel = [[[arraylist  objectAtIndex:indexPath.row]valueForKey:@"level"]intValue];

 if (indentLevel == 0) {

    return 40;
}
else if (indentLevel == 1)
{
    return 25;
}
else if (indentLevel == 2)
{
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:[CustomCell reuseIdentifier]];

    CGSize maximumSize = CGSizeMake(300, 9999);
    UIFont *myFont = [UIFont fontWithName:@"Arial" size:11.5];
    CGSize myStringSize = [cell.txtAddress.text sizeWithFont:myFont constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping];
    [cell.txtAddress setFrame:CGRectMake(cell.txtAddress.frame.origin.x, cell.txtAddress.frame.origin.y, cell.txtAddress.frame.size.width, myStringSize.height)];

    if (myStringSize.height > 80) {
        myStringSize.height = 50;
        [cell.txtAddress setFrame:CGRectMake(cell.txtAddress.frame.origin.x, cell.txtAddress.frame.origin.y, cell.txtAddress.frame.size.width, myStringSize.height)];
        cell.txtAddress.scrollEnabled = YES;
    }
    else
    {
        cell.txtAddress.scrollEnabled = YES;
        myStringSize.height = 40;
    }
    //NSLog(@"String Size :: %f", myStringSize.height);
    return myStringSize.height+ 50;

}
else
    return 40;
  }
 #pragma mark - TableAnimation
-(void)miniMizeThisRows:(NSArray*)ar
{
     for(NSDictionary *dInner in ar ) {
    NSUInteger indexToRemove=[arraylist indexOfObjectIdenticalTo:dInner];
    NSArray *arInner=[dInner valueForKey:@"Objects"];
    if(arInner && [arInner count]>0){
        [self miniMizeThisRows:arInner];
    }

    if([arraylist indexOfObjectIdenticalTo:dInner]!=NSNotFound) {
        [arraylist removeObjectIdenticalTo:dInner];
        [tblist deleteRowsAtIndexPaths:[NSArray arrayWithObject:
                                                [NSIndexPath indexPathForRow:indexToRemove inSection:0]]
                              withRowAnimation:UITableViewRowAnimationNone];
    }
}

}
4

3 回答 3

0

这可能是因为您的自定义单元格 XIB 中未设置 txttext Outlet。如果您的自定义单元格 XIB 中存在 txttext 插座,我无法在您的代码中看到。因此,请通过右键单击文件所有者来检查您的 xib 文件,并检查是否正确引用了每个出口。

于 2013-05-02T10:26:58.500 回答
0

如果你想使用 customCell 然后尝试,

- (UITableViewCell *)cellForIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath forClass:(Class)class {
    UITableViewCell *cell = [self.tableObj dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = (UITableViewCell *)[[class class] loadNibNamed:NSStringFromClass(class)];
    }
    return cell;
}

在 NSObject Category 类中添加方法,

+ (id)loadNibNamed:(NSString *)NibName {
    NSObject *cl = nil;
    if (NSClassFromString(NibName) != nil) {
        NSArray *arr = [[NSBundle mainBundle] loadNibNamed:NibName owner:self options:nil];
        for (id cls in arr) {
            if([cls isKindOfClass:NSClassFromString(NibName)])
            {
                cl = cls;
                break;
            }
        }
    }
    return cl;
}

打电话喜欢

static NSString *CellIdentifier = @"CustomCellIdentifier";
CustomCell *cell = (CustomCell *)[self cellForIdentifier:CellIdentifier forIndexPath:indexPath forClass:NSClassFromString(@"CustomCell")];
于 2013-05-02T10:30:21.833 回答
0

您可以通过这种方式使用自定义单元格:-

 NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TestCustomCell" owner:self options:nil];

 TestCustomCell *cell = (TestCustomCell *)[nib objectAtIndex:0];

这个定制的笔尖将被退回。

并检查插座配置不正确。请设置。

于 2013-05-02T10:42:34.430 回答