Нужен подход для отображения таблиц с использованием сегментированного управления?

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

Спасибо Сэнди

Ответ 1

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

Сначала добавьте 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;
}

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

- (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;
}

Об этом, надеюсь, это поможет.

Ответ 2

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