Какой правильный способ добавить ToolBar в UITableView?
Я пишу приложение для навигации на основе навигации, и я хотел бы, чтобы UIToolBar был состыкован в нижней части экрана, с прокруткой UITableView между панелью инструментов и навигационной панелью.
Я видел пару форумов, на которых было предложено, чтобы View Controller, обрабатывающий это представление, был стандартным UIViewController, а не UITableViewController. Контроллер представления должен был бы реализовать делегат UITableView и методы источника данных в дополнение ко всем стандартным переопределениям UIViewController. Какую (если есть) встроенную функциональность мне нужно воссоздать в этом подклассе контроллера вида, отличном от вышеупомянутых протоколов, чтобы заставить его действовать как UITableViewController? Я что-то теряю, идя по этому маршруту?
Или было бы лучше вложить UITableViewController внутри стандартного UIViewController?
Ответы
Ответ 1
Как и OS 3.0, контроллер навигации имеет встроенную панель инструментов. Чтобы она появилась:
[self.navigationController setToolbarHidden:NO];
Применяя:
- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated
в вашем контроллере просмотра вы можете настроить элементы панели инструментов.
Поэтому вам больше не нужно беспокоиться о том, где панель инструментов находится в вашей иерархии.
(исправленная опечатка)
Ответ 2
Кори Флойд в основном правильный, за исключением того, что
[self.navigationController setToolBarHidden:NO];
должен быть
[self.navigationController setToolBarHidden:NO];
То есть, "b" в "setToolbarHidden" должен быть строчным. Кроме того, имя метода, перечисленное в Справочник по iPhone OS на самом деле
- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated
хотя, похоже, работает и параметр animated
.
Ответ 3
//Tool bar
[self.navigationController setToolbarHidden:NO];
UIBarButtonItem *buttonItem = [[ UIBarButtonItem alloc ] initWithTitle: @"Select All"
style: UIBarButtonItemStyleBordered
target: self
action: @selector(selectAll:) ];
UIBarButtonItem *buttonNext = [[UIBarButtonItem alloc]initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(goNext:)];
self.toolbarItems = [ NSArray arrayWithObjects: buttonItem, buttonNext, nil ];
[ buttonItem release ];
[buttonNext release];
Ответ 4
Все, что вам нужно, это реализовать методы UITableViewDelegate и UITableViewDatasource, необходимые для уровня требуемого уровня представления табличного представления. Эти методы могут быть в любом классе (классах), хотя указанные классы должны соответствовать соответствующим протоколам. Делегат и источник данных должны быть установлены в экземпляре UITableView - либо программно, либо с помощью Interface Builder. В соответствии с документами вы теряете функциональность - см. Раздел .
Лично я считаю, что многие разработчики, похоже, одержимы тем, что предоставляют все эти функции в одном классе контроллера монолитного представления, и что, поскольку у них есть представление таблицы в их представлении, необходимо использовать подкласс UITableViewController. Тем не менее, мне нравится рассматривать принцип единой ответственности и часто нарушает источник данных и делегирует его на отдельные классы, когда сложность - это нечто иное, чем простое. Код также не привязан к конкретной реализации UIViewController.
В ситуациях, когда у меня есть отдельные классы datasource/delegate, я часто создаю и подключаю их к представлению таблицы с помощью Interface Builder, а не в коде. Этот подход (по крайней мере для меня) находится в духе "Injection of Dependency" и сохраняет текст кода котельной и дает некоторый уровень decoupling.
На эти варианты, конечно, влияет сложность функциональных возможностей, которые вы пытаетесь достичь - для простых реализаций я мог бы использовать UITableViewController.
Ответ 5
Попробуйте следующее:
self.navigationController.toolbarHidden = NO;
Надеюсь, это поможет вам.