2009-07-02 2 views
25

Я пишу приложение на основе навигации на основе iPhone, и я хотел бы иметь UIToolBar, прикрепленный к нижней части экрана, с прокруткой UITableView между панелью инструментов и навигационной панелью.Каков правильный способ добавления ToolBar в UITableView?

Я видел пару форумов, на которых было предложено, чтобы View Viewer, обрабатывающий это представление, был стандартным UIViewController, а не UITableViewController. Контроллер представления должен был бы реализовать делегат UITableView и методы источника данных в дополнение ко всем стандартным переопределениям UIViewController. Какую (если есть) встроенную функциональность мне нужно воссоздать в этом подклассе контроллера вида, отличном от вышеупомянутых протоколов, чтобы заставить его действовать как UITableViewController? Я что-то теряю, идя по этому маршруту?

Или было бы лучше вставить UITableViewController внутри стандартного UIViewController?

ответ

49

В ОС 3.0 Навигационный контроллер имеет панель инструментов, построенный в Чтобы он появился:.

[self.navigationController setToolbarHidden:NO]; 

По implmenting:

- (void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated 

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

Поэтому вам больше не нужно беспокоиться о том, где находится панель инструментов в вашей иерархии.

(исправленная опечатка)

2

Все, что вам нужно, это реализовать методы UITableViewDelegate и UITableViewDatasource, необходимые для уровня требуемого уровня представления табличного представления. Эти методы могут быть в любом классе (классах), хотя указанные классы должны соответствовать соответствующим протоколам. Делегат и источник данных должны быть установлены в экземпляре UITableView - либо программно, либо с помощью Interface Builder. Согласно документам будет потерять некоторые функциональные возможности - см. overview section.

Лично я считаю, что многие разработчики, похоже, одержимы предоставлением всех этих функций в одном классе контроллера монолитного представления, и потому, что они имеют представление таблицы в своем представлении, необходимо использовать подкласс UITableViewController. Тем не менее, мне нравится рассматривать Single Responsibility Principle и часто ломает источник данных и делегирует их в отдельные классы, когда сложность - это нечто иное, чем простое. Код также не привязан к конкретной реализации UIViewController.

В ситуациях, когда у меня есть отдельные классы источника данных/делегата, я часто создаю и подключаю их к представлению таблицы с помощью Interface Builder, а не в коде. Этот подход (по крайней мере для меня) находится в духе Dependency Injection и экономит написание некоторого кода котельной пластины и обеспечивает некоторый уровень decoupling.

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

9

Corey Floyd в основном правильно, за исключением того, что

[self.navigationController setToolBarHidden:NO]; 

должен быть

[self.navigationController setToolbarHidden:NO]; 

То есть, "Ъ" в "setToolbarHidden" должны быть в нижнем регистре , Кроме того, имя метода перечислены в iPhone OS Reference на самом деле

- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated 

, хотя, кажется, опуская параметр animated тоже работает.

+0

oops, исправлено. –

0

Попробуйте это:

self.navigationController.toolbarHidden = NO; 

Надеется, что это помогает.

7
//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];