Строка действия UITableView - PullRequest
       2

Строка действия UITableView

0 голосов
/ 18 октября 2011

В видео WWDC 11 «Сессия 125 - UITableCiew: Изменения, советы, хитрости» в 24:30+ Г-н Люк Хистерман демонстрирует демонстрацию, которая добавляет ячейку в табличное представление при выборе ячейки.

Screenshot from the video

Я хочу добавить эту функциональность в свое приложение IOS, но не могу понять, как это сделать.

Некоторый код не отображается в демо-видео. И нет загружаемого источника демо.

Кто-нибудь может мне помочь?

EDIT:

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

(у меня есть список договоров, которые вы можете принять)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return ((indexPath.row >= [_contracts count]) ? 40 : 60);
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_contracts count] + ((_addedRow) ? 1 : 0);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *reuseID = @"contract_cell";

    ContractTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseID];

    if(!cell)
    {
        // Load the top-level objects from the custom cell XIB.
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ContractTableViewCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];
        [cell setBackgroundView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"contract_cell.png"]]];
    }

    NSLog(@"row?: %d", indexPath.row);
    //I thought this would work... not.
    if((indexPath.row >= [_contracts count]))
    {
        [cell.label setText:@"new"];
    }
    else
    {
        Contract *contract = [_contracts objectAtIndex:indexPath.row];

        [cell.label setText:@"test"];
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(!_addedRow)
    {
        _addedRow = YES;

        [tableView deselectRowAtIndexPath:indexPath animated:NO];

        [_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
}

Например, я нажимаю первый ряд. Ряд добавлен ниже первого. Но теперь cellForRowAtIndexPath .. вызывается для строки 2 (должен быть новый пользовательский)

как я могу проверить, новый ли он?

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Вам нужно запомнить, какая из ваших строк выбрана, чтобы показать добавленную строку с правильным индексом.В настоящее время вы всегда предполагаете, что добавленная строка является самой последней, потому что вы конфигурируете ее в tableView:cellForRowAtIndexPath: только в том случае, если индекс больше вашего числа контрактов.

Допустим, у вас есть пять контрактов итретий выбран.if((indexPath.row >= [_contracts count])) верно только для последней строки, но на самом деле это условие должно быть истинным для четвертой строки, поэтому оно должно быть if (indexPath.row == selectedRowIndex + 1) (вам нужно сохранить индекс выбранной строки в некоторой переменной экземпляра).

0 голосов
/ 18 октября 2011

Этот ответ должен помочь вам. Он рассказывает, как перевести ваш UITableViewController в «режим обновления», а затем позволяет вставлять новые строки (даже с анимацией): UITextField в UITableViewCell - добавление новых ячеек

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