Проблема добавления UIBarButtonItems в панель инструментов
У меня есть UINavigationController с UITableViewController в нем. Я хочу показать ToolBar внизу с помощью UIBarButtonItem. Появится ToolBar, но кнопки не появятся. Кто-нибудь знает почему?
- (void)viewDidLoad {
[super viewDidLoad];
[[self navigationItem] setTitle:@"Selections List"];
[[self navigationItem] setRightBarButtonItem:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addProjectSearch:)] autorelease]];
[[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];
[[super tableView] setDataSource: self];
[[super tableView] setDelegate: self];
//Toolbar
UIBarButtonItem * logoutButton = [[[UIBarButtonItem alloc] initWithTitle:@"Log out" style:UIBarButtonItemStylePlain target:self action:@selector(logOut:)]autorelease];
NSMutableArray * arr = [NSMutableArray arrayWithObjects:logoutButton, nil];
[[self navigationController] setToolbarHidden: NO animated:YES];
[[self navigationController] setToolbarItems:arr animated:YES];
}
Ответы
Ответ 1
Я обнаружил в documentation Apple небольшой абзац, объясняющий UIToolBar. В этом параграфе есть очень крошечное предложение: "[..] Когда отображается, эта панель инструментов получает свой текущий набор элементов из свойства toolbarItems активного контроллера представления [..]" Но они не объясняют это мнение первым должен быть активным, чтобы получить эти кнопки. Таким образом, это означает, что UIToolBar готов извлечь его. Кнопки на viewDidAppear и NOT на сообщении viewDidLoad.
- (void)viewDidAppear:(BOOL)animated {
[[self tableView] reloadData];
[[self navigationController] setToolbarHidden: NO animated:YES];
UIBarButtonItem * logoutButton = [[[UIBarButtonItem alloc] initWithTitle:@"Log out" style:UIBarButtonItemStylePlain target:self action:@selector(logOut:)]autorelease];
NSMutableArray * arr = [NSMutableArray arrayWithObjects:logoutButton, nil];
[self setToolbarItems:arr animated:YES];
[super viewDidAppear:animated];
}
Ответ 2
Заменить эту строку:
[[self navigationController] setToolbarItems:arr animated:YES];
с этим:
[self setToolbarItems:arr animated:YES];
В общем, вы должны установить toolbarItems
на каждом отдельном контроллере представления, который вы нажимаете, а не на свой UINavigationController.
Ответ 3
Возможно, вы можете использовать конструктор интерфейса, чтобы избежать этого, однако он будет медленнее
Ответ 4
http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html
"Теперь объект контроллера навигации управляет дополнительной панелью инструментов в своей иерархии представлений. При отображении эта панель инструментов получает свой текущий набор элементов из свойства toolbarItems активного контроллера представления."
Пробовали ли вы подклассифицировать UITableViewController для своего табличного представления и настроить с помощью соответствующего свойства toolbarItems?
Ответ 5
Я создал контроллер вида, который является подклассом UITableViewController, и у меня есть панель инструментов, которая работает следующим образом:
В viewDidLoad:
self.navigationController.toolbar.barStyle = UIBarStyleBlackTranslucent;
NSArray* toolbarItems = [NSArray arrayWithObjects: button1,
button2,
button3,
nil];
[self setToolbarItems:toolbarItems animated:NO];
Затем, поскольку я хочу, чтобы панель инструментов была только на этом экране, я добавил это в viewWillAppear:
[self.navigationController setToolbarHidden:NO animated:YES];
И, наконец, я снова скрываю панель инструментов в viewWillDisappear:
[self.navigationController setToolbarHidden:YES animated:YES];
Это работает для меня с помощью "текстовых" кнопок, встроенных значков и пользовательских значков.