Нужен подход к отображению таблиц с использованием сегментированного управления? - PullRequest
11 голосов
/ 16 января 2010

Привет, я использую сегментированный элемент управления для представления. С помощью этого сегментированного элемента управления я хотел бы отобразить различные таблицы на моем представлении. Предположим, у меня есть два сегмента в моей таблице на отводе сегмента 1 Я хотел бы отобразить таблицу 1 и на отводе сегмента 2 я хотел бы отобразить Таблица 2 Моя таблица 1 - это простая таблица, а таблица 2 - это сгруппированная таблица, Apple использует подход для отображения разных приложений в разных категориях в магазине приложений, но я не уверен, как мне это сделать. Пожалуйста, предложите любой подход или любой пример кода для того же будет также оценен.

Спасибо Песчаный

Ответы [ 2 ]

26 голосов
/ 16 января 2010

Мы делаем это с помощью одного табличного представления, а затем выполняем оператор if / case в каждом методе обратного вызова табличного представления, чтобы получить правильные данные на основе того, какое значение выбрано в сегментированном элементе управления.

Сначала добавьте segmentedControl в titleView и установите функцию обратного вызова при его изменении:

- (void) addSegmentedControl {
    NSArray * segmentItems = [NSArray arrayWithObjects: @"One", @"Two", nil];
    segmentedControl = [[[UISegmentedControl alloc] initWithItems: segmentItems] retain];
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    segmentedControl.selectedSegmentIndex = 0;
    [segmentedControl addTarget: self action: @selector(onSegmentedControlChanged:) forControlEvents: UIControlEventValueChanged];
    self.navigationItem.titleView = segmentedControl;
}

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

- (void) onSegmentedControlChanged:(UISegmentedControl *) sender {
    // lazy load data for a segment choice (write this based on your data)
    [self loadSegmentData:segmentedControl.selectedSegmentIndex];

    // reload data based on the new index
    [self.tableView reloadData];

    // reset the scrolling to the top of the table view
    if ([self tableView:self.tableView numberOfRowsInSection:0] > 0) {
        NSIndexPath *topIndexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
        [self.tableView scrollToRowAtIndexPath:topIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    }
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"GenericCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"GenericCell" owner:self options:nil] objectAtIndex: 0];
    }   

    if (segmentedControl.selectedSegmentIndex == 0) { 
        cell.textLabel.text = @"One";
    } else if (segmentedControl.selectedSegmentIndex == 1) {
        cell.textLabel.text = @"Two";
    }
    return cell;
}

Вот и все, надеюсь, это поможет.

3 голосов
/ 16 января 2010

Другой альтернативой является представление контейнера, которое вы добавляете в зависимости от того, какой tableView является текущим в качестве подпредставления. Вы даже можете иметь каждую таблицу в отдельном контроллере представления, чтобы отделить вещи, создав контроллеры представления таблицы и затем добавив .view как подпредставление контейнера, но если вы сделаете это, вам придется вручную вызвать viewWillAppear и viewWillDisapear (что не очень сложно, так как вы просто вызываете их при замене таблиц при касании сегментированного элемента управления).

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