UITableView проблема с добавлением дополнительной ячейки - PullRequest
0 голосов
/ 29 марта 2011

Первый вопрос на этом сайте, хотя я уже давно за кулисами.У меня есть проблема, которую я мучил последние два дня, и я надеюсь, что кто-то может пролить свет на это для меня.

У меня есть UITableView, который загружается из базы данных SQL.В нем 15 записей.Я вставил дополнительную ячейку в начале UITableView.Эта дополнительная ячейка предназначена для UITextField и UIButton, которые добавляют элемент в базу данных.

Когда представление загружено, первая ячейка с пользовательскими объектами отображается нормально, а остальная часть таблицы заполняется элементами из базы данных и выглядит так, как должно.Тем не менее, когда UITableView прокручивается вниз, так что первая ячейка не видна, затем выполняется резервное копирование, оно берет значение элемента 11-й строки и показывает его поверх первой ячейки.

Вот мой код:

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

static NSString *CellIdentifier = @"Cell";

static NSInteger NameTag = 1;


UITableViewCell *cell = [popTableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];


    CGRect frame;

    frame.origin.x =50;

    frame.origin.y =10;

    frame.size.height =22;

    frame.size.width =275;


    UILabel *nameLabel = [[UILabel alloc] initWithFrame:frame];

    nameLabel.tag = NameTag;

    nameLabel.opaque = YES;

    nameLabel.textColor = [UIColor grayColor];

    nameLabel.backgroundColor = [UIColor clearColor];

    [cell.contentView addSubview:nameLabel];

    [nameLabel release];


}

int row = [indexPath row];
if (row == 0) {

    UIButton *buttonLeft = [UIButton buttonWithType:UIButtonTypeCustom];
    [buttonLeft setFrame: CGRectMake( 205, 6, 40, 33)];
    [buttonLeft addTarget:self action:@selector(addToList:) forControlEvents:UIControlEventTouchUpInside];

    [cell addSubview:buttonLeft];

//No Alloc for txtField, it is built in IB
    [txtField setBorderStyle:UITextBorderStyleNone];
    [txtField setFrame: CGRectMake( 17, 12, 180, 23)];
    txtField.backgroundColor = [UIColor clearColor];
    [txtField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

    txtField.clearButtonMode = UITextFieldViewModeAlways;


}else{

    UILabel * nameLabel = (UILabel *) [cell.contentView viewWithTag:NameTag];

    Add *theObj = [self.theArray objectAtIndex:indexPath.row - 1];

    [nameLabel setText:theObj.itemName];


    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;



    UIImageView *imageView = [cell viewWithTag:kTagCellImageView];
    if (imageView == nil) {
        imageView = [[UIImageView alloc]initWithFrame:CGRectMake(10.0, 10.0, 13.0, 25.0)];
        imageView.backgroundColor = [UIColor clearColor];
        imageView.tag = kTagCellImageView;
        [cell.contentView addSubview:imageView];

    }


    if([theObj.itemName isEqualToString:@"First Street"]){
        imageView.frame = CGRectMake(14,10,13,25);
        [imageView setImage:[UIImage imageNamed:@"firststreet"]];
    }
    else if([theObj.itemName isEqualToString:@"Second Street"]){
        imageView.frame = CGRectMake(8,12,29,20);
        [imageView setImage:[UIImage imageNamed:@"second"]];
    }
    else if([theObj.itemName isEqualToString:@"Main Street"]){
        imageView.frame = CGRectMake(15,10,13,25);
        [imageView setImage:[UIImage imageNamed:@"mainstreet"]];
    }
    else{

        imageView.frame = CGRectMake(8,8,25,25);
        [imageView setImage:[UIImage imageNamed:@"iconcustom"]]; 

    }



    NSLog(@"%@",itemName);
    NSLog(@"%@",itemCategory);


   }

return cell;

}

Также вот мой cellForRow:

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

return [self.theArray count] + 1; //Add Extra cell to beginning

}

Любые идеи будут с благодарностью.

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Вам необходимо использовать другой reuseIdentifier для первой ячейки. Попробуйте это:

NSString *cellIdentifier;
if (indexPath.row == 0) {
    cellIdentifier = @"first";
} else {
    cellIdentifier = @"not first";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
// .. cell initialization
}
1 голос
/ 29 марта 2011

Обязательный тангенциальный ответ. Задумывались ли вы о том, чтобы вместо этого установить TableHeaderView в UITableView?Я думаю, что это позволит выполнить то, что вы пытаетесь сделать более чистым способом (в том смысле, что это добавляет произвольное представление к вершине таблицы).

Просто создайте UIView с вашим "добавьте новый элемент"управления в нем, а затем установить его в качестве представления заголовка при первом создании таблицы.

0 голосов
/ 29 марта 2011

Проблема здесь

static NSString *CellIdentifier = @"Cell";

static NSInteger NameTag = 1;


UITableViewCell *cell = [popTableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

вы исключаете все ячейки из очереди с одним и тем же идентификатором.Строка 1 (индекс 0) должна иметь свой собственный CellIdentifier.Также похоже, что вы продолжаете добавлять подпредставления в те же ячейки, которые вы удаляете.При проверке if(cell == nil) вы можете решить, хотите ли вы удалить все ячейки contentView подпредставления или использовать их повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...