У меня есть 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];
}
Я обнаружил, что в документации Apple есть небольшой абзац, объясняющий UIToolBar. В этом абзаце есть очень крошечное предложение, гласящее: «[..] При отображении эта панель инструментов получает свой текущий набор элементов из свойства toolbarItems активного контроллера представления [..]» Но они сначала не объясняют это представление должен быть активен, чтобы получить эти кнопки. Это означает, что UIToolBar готов получить свои кнопки в сообщении viewDidAppear, а НЕ в сообщении 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];
}
Замените эту строку:
[[self navigationController] setToolbarItems: arr animated: YES];
следующим образом:
[self setToolbarItems: arr animated: YES];
В общем, вы должны установить toolbarItems
на каждом отдельном контроллере представления, который вы нажимаете, а не на самом UINavigationController.
Возможно, вы можете использовать построитель интерфейсов, чтобы избежать этого, но он будет медленнее
"Объект контроллера навигации теперь управляет дополнительной панелью инструментов в своей иерархии представления. При отображении эта панель получает текущий набор элементов из свойства toolbarItems активного контроллера представления."
Пробовали ли вы подклассифицировать UITableViewController для вашего tableview и установить соответствующее свойство toolbarItems?
Я создал контроллер представления, который является подклассом 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];
У меня это работает с «текстовыми» кнопками, встроенными значками и пользовательскими значками.