Настройте управляемый данными TableView - PullRequest
0 голосов
/ 17 ноября 2009

У меня есть сгруппированное табличное представление, заполненное данными XML в одном разделе. То, что я хотел бы сделать, это создать еще один раздел, предшествующий управляемому данными, и применить к нему действие.

Пример:

Пользователю предоставляется кнопка с надписью «использовать ваше текущее местоположение» (созданный вручную раздел), а ниже представлен список стран, из которых пользователь может альтернативно выбирать из (раздел, управляемый данными)

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

Если это не имеет смысла, я постараюсь объяснить это лучше.


Итак, у меня есть эти две очевидные строки кода ... достаточно просто

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}    
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [countrysData count];
    }

Мне бы хотелось, чтобы numberOfSectionsInTableView вернул 2 и в первом «Разделе» говорилось «Нажмите, чтобы использовать ваше текущее местоположение», которое затем отображало карту, а во втором разделе отображался список стран, в которых я остановился. В настоящее время работают.

Ответы [ 3 ]

1 голос
/ 17 ноября 2009

Вам просто нужно обновить все ваши реализации протоколов UITableViewDataSource и UITableViewDelegate, чтобы соответствующим образом учесть новый раздел и его строки.

Например, вот как обновить numberOfSectionsInTableView: , tableView: numberOfRowsInSection: и tableView: cellForRowAtIndexPath: , но вы захотите обновить как минимум tableView: didSelectRowAtIndexPath: , а также:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // calculate the number of sections of non-data (might just be 1)    
    // calculate the number of sections for the data (you were already doing this, might just be 1)
    // return the sum
    return 1 + 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger rowCount = 0;
    switch (section) {
    case 0:
        // non-data section has 1 row/cell
        rowCount = 1;
        break;
    case 1:
        // data section uses an array
        rowCount = [dataArray count];
        break;
    }
    return rowCount;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *nonDataCellID = @"NonDataCell";
    static NSString *dataCellID = @"DataCell";
    UITableViewCell *cell;

    int section = [indexPath indexAtPosition:0];
    int row = [indexPath indexAtPosition:1];

    switch (section) {
        case 0:
            // or you can just use standard cells here
            cell = [tableView dequeueReusableCellWithIdentifier:nonDataCellID];
            if (cell == nil) {
                [[NSBundle mainBundle] loadNibNamed:@"NonDataCell" owner:self options:NULL];
                cell = nonDataCell; // nonDataCell is an IBOutlet to this custom cell
            }

            // configure non-data cell here (use tags)
            UILabel *someLabel = (UILabel*)[cell viewWithTag:1];
            someLabel.text = @"Non-data cell";
            break;

        case 1:
            // or you can just use standard cells here
            cell = [tableView dequeueReusableCellWithIdentifier:dataCellID];
            if (cell == nil) {
                [[NSBundle mainBundle] loadNibNamed:@"dataCell" owner:self options:NULL];
                cell = dataCell; // dataCell is an IBOutlet to this custom cell
            }

            // configure data call here (using "row")
            UILabel *someDataLabel = (UILabel*)[cell viewWithTag:1];
            someDataLabel.text = [[dataArray objectAtIndex:row] valueForKey:@"name"];
            break;
       }

    return cell;
}
1 голос
/ 17 ноября 2009
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if(section == 0){
        return 1;
    }else{
        return [countrysData count];
    }
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}   

тогда вы должны выбрать, что делать в вашем didSelectRowAtIndexPath: метод из-за indexPath.section. о, и вы должны проверить indexPath.section в вашем cellForRowAtIndexPath: метод.

0 голосов
/ 17 ноября 2009

Я почти уверен, что вы можете на лету изменить метод UITableViewDataSource 'numberOfSectionsInTableView:'. Как только пользователь выберет выбор дополнительного раздела, просто установите флажок, чтобы метод возвращал желаемое количество таблиц. Затем вы перезагружаете таблицу, и вы должны увидеть новый раздел.

...