Переключение между стандартной и сгруппированной таблицами стилей с помощью сегментированного управления - PullRequest
2 голосов
/ 29 июля 2011

Я хочу использовать UISegmentedControl для переключения между двумя таблицами в одном представлении.Одна таблица (по умолчанию при загрузке представления) группируется.Вторая таблица должна быть простой (не сгруппированной).Для tableView установлено значение Grouped in xib.

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

Лучшая идея, которую я имел, - это создать второй (простой) tableView в коде, а затем перевернутьмежду двумя по мере необходимости.Я мог бы либо показать / скрыть (сохраняя их оба в памяти), либо добавить и удалить из superView.

Оба вида могут привести к тому, что пользователь перейдет к дополнительным выдвинутым viewControllers.Я хочу сохранить согласованность с цепочкой, включая возможность popToRootViewController из viewControllers дальше по цепочке (рассматриваемое представление находится в двух или трех шагах от корня).

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

Спасибо!

ОБНОВЛЕНИЕ: Как добраться.Когда я хочу отобразить простое табличное представление, у меня есть это:

PlainViewController *plainViewController = [[PlainViewController alloc] init];
UIView *plainTableView = plainViewController.view;
plainTableView.frame = CGRectMake(320, 0, 320, 480);
[self.view addSubview:plainViewController.view];

, который загружается и отображается нормально.Но когда запускается PlainViewController didSelectRowAtIndexPath, он не может загрузить следующее представление.didSelectRowAtIndexPath стреляет (он зарегистрирован), но pushViewController ничего не делает;viewDidLoad следующего представления никогда не срабатывает.

Я подозреваю, что в NavigationController есть разрыв, но не совсем уверен, где это исправить.

Ответы [ 5 ]

1 голос
/ 30 июля 2011

Вы можете использовать два разных представления, которые имеют таблицу с обоими стилями, но с одинаковыми данными, и вы можете перевернуть эти два представления для выбранного события изменения индекса выбранного сегмента

OR

Вы должны удалить таблицу из ее суперпредставления, а затем перераспределить таблицу с выбранным стилем и снова добавить ее в это представление.

1 голос
/ 30 июля 2011

Назначьте tableViewStyle как - (void) refreshTable;, а затем, когда вы нажмете на свой сегментированный элемент управления, также вызовите [myTable reloadData];

1 голос
/ 29 июля 2011

Вы можете создать отдельный UIViewController и добавить его таблицу в «основное» представление.

PlainTableViewController *ctr = [[PlainTableViewController alloc] init];
[self.view addSubview:ctr.view];
[ctr release];

Вы также можете легко оживить этот процесс:

PlainTableViewController *ctr = [[PlainTableViewController alloc] init];

UIView *plainTableView = ctr.view;
plainTableView.frame = CGRectMake(320, 0, 320, 480);
[self.view addSubview:plainTableView];

[UIView animateWithDuration:0.3
        animations:^{ 
            groupedTableView.frame = CGRectMake(-320, 0, 320, 480);
            plainTableView.frame = CGRectMake(0, 0, 320, 480);}
        completion:^(BOOL finished){[groupedTableView removeFromSuperView];}
];

[ctr release];

Примечание: Вы не добавляете его в качестве контроллера представления в свой контроллер навигации, поэтому все вызовы popToRootViewController должны вести к вашему «главному» viewController. И это то, что вы хотите.

0 голосов
/ 30 июля 2011

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

Но вы все равно перерисовали бы представление с помощью reloadData, так что это просто минимальная загрузка ЦП для простого воссоздания представления.

-(void)segmentedControlChanged{

CGRect originalFrame = tableView.frame;

UITableViewStyle tableStyle;

if(selectedSegmentIndex == 0){
tableStyle = UITableViewStylePlain;
} else {
tableStyle = UITableViewStyleGrouped;
}

[tableView removeFromSubview];
tableView = [[UITableView alloc] initWithFrame:originalFrame style:tableStyle];
tableView.delegate = self;
tableView.dataSource = self;
[self.view addSubview:tableView];

}

Примечание: код, написанный памятью без проверки в Xcode.

0 голосов
/ 29 июля 2011

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

Чтобы сохранить согласованность, я думаю, что подход где-то хранит информацию о том, какое представление выбраночерез сегментированный элемент управления, чтобы при отображении этого представления вы знали, какой стиль является текущим.Эта информация также будет храниться в NSUserDefaults, поэтому она будет постоянной при каждом запуске.

...