Почему мы проверяем, если (cell == nil) в UITableViewController? - PullRequest
7 голосов
/ 14 марта 2012

Я пытаюсь реализовать приложение на основе UITableView. Для этого я выбираю UITableViewStyle - Group. В моем TableView их - 15 секция, каждая секция имеет 1 строку.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 15;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return 1;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section==12) 
    {
        return 120;
    }
    else
    {
        return 60;
    }

}

Я хочу добавить UITextView в разделе 12

Для этого я сделал следующий код

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];



    }
    if ([indexPath section] == 12) 
    {
        if([indexPath row]==0)
        {
            descriptionTextField=[[UITextView alloc] initWithFrame:CGRectMake(5, 8, 290, 106)];
            descriptionTextField.font = [UIFont systemFontOfSize:15.0];   
            descriptionTextField.backgroundColor=[UIColor scrollViewTexturedBackgroundColor];

            [descriptionTextField setDelegate:self];
            [descriptionTextField setTag:2];
            [descriptionTextField setText:@"Enter Location Description."];

            descriptionTextField.keyboardType=UIKeyboardTypeDefault;
            descriptionTextField.returnKeyType=UIReturnKeyNext;


            descriptionTextField.textColor=[UIColor blackColor];
            descriptionTextField.editable=YES;
            descriptionTextField.autocapitalizationType=UITextAutocapitalizationTypeWords;
            descriptionTextField.autocorrectionType=UITextAutocorrectionTypeDefault;
            descriptionTextField.textAlignment=UITextAlignmentLeft;

            UIToolbar*  keboardToolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 32)];

            UIBarButtonItem *extra=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
            UIBarButtonItem *Done=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(keyboardDoneButtonActin:)];
            [Done setWidth:65.0f];
            [keboardToolBar setItems:[[[NSArray alloc]initWithObjects:extra,Done, nil]autorelease] ];
            [extra release];
            [Done release];

            [keboardToolBar setTintColor:[UIColor blackColor]];
            [keboardToolBar setAlpha:.70];
            [descriptionTextField setInputAccessoryView:keboardToolBar];
            [descriptionTextField setTag:101];
            [cell.contentView addSubview:descriptionTextField];
            [descriptionTextField release];
        }
    }

    return cell;
}

На начальной стадии табличное представление выглядит следующим образом

enter image description here

если я прокручиваю просмотр таблицы вверх и вниз, изменился раздел uitextView, и он отобразит несколько мест.

enter image description here

Я не могу понять свою ошибку, почему это случилось?

if реализую приведенный выше код в стороне if (cell == nil)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    if ([indexPath section] == 12) 
    {
        if([indexPath row]==0)
        {
           **/* implemention  all code here*/**

             [cell.contentView addSubview:descriptionTextField];
            [descriptionTextField release];
        }
    }

    return cell;

}

UITextView не показывается, я думаю, что он не выделяется.

Так в чем же отличие реализации кода в если (ячейка == ноль) { внутри }

if (cell == nil) { } наружу

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Тест if (cell == nil) обрабатывает случай, когда нет многократно используемых ячеек для удаления из очереди, и в этом случае вы должны создать новую ячейку. Когда вы создаете новую ячейку, вы несете ответственность за построение ее иерархии представлений.

0 голосов
/ 14 марта 2012
NSString *CellIdentifier = [NSString stringWithFormat:@"%i",indexPath.row];

// Dequeue or create a cell of the appropriate type.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

Может использоваться вместо

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

это простой пример для записи внутри ячейки == nill

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

static NSString *CellIdentifier = @"CellIdentifier";
// Dequeue or create a cell of the appropriate type.
UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier];
cell= nil;
if (cell == nil) 
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    [[cell.contentView viewWithTag:100+indexPath.row] removeFromSuperview]; 

    UIView *selectview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, cell.frame.size.width, 30)];
    [selectview setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"strip_s12A-1_h.png"]]];
    cell.selectedBackgroundView = selectview;
    [selectview release];

    UILabel *cellTitle=[[UILabel alloc]initWithFrame:CGRectMake(40, 0, 300, 30)];
    //cellTitle.adjustsFontSizeToFitWidth=YES;
    [cellTitle setBackgroundColor:[UIColor clearColor]];
    [cellTitle setFont:[UIFont fontWithName:@"Arial Rounded MT Bold" size:17]];
    [cellTitle setTextColor:[UIColor blackColor]];
    cellTitle.tag = 100+indexPath.row;

        cellTitle.text= [[[cellArray objectAtIndex:indexPath.section]objectAtIndex:indexPath.row] valueForKey:@"Des2"];

    [cell.contentView addSubview:cellTitle];

    [cellTitle release];
}
return cell;
     }

Я думаю, будет достаточно

...