Проблема добавления UIBarButtonItems в панель инструментов - PullRequest
12 голосов
/ 19 марта 2010

У меня есть UINavigationController с UITableViewController в нем. Я хочу показать панель инструментов в нижней части с UIBarButtonItem's. Панель инструментов отображается, но кнопки не отображаются. Кто-нибудь знает почему?

  - (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]; 
    }

Ответы [ 5 ]

46 голосов
/ 19 марта 2010

Заменить эту строку:

[[self navigationController] setToolbarItems:arr animated:YES];

с этим:

[self setToolbarItems:arr animated:YES];

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

14 голосов
/ 19 марта 2010

Я обнаружил в документации 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];
}
0 голосов
/ 12 июня 2010

Я создал контроллер представления, который является подклассом 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];

И, наконец, я снова скрываю панель инструментов в поле зрения. Исчезает:

[self.navigationController setToolbarHidden:YES animated:YES];

Это работает для меня с «текстовыми» кнопками, встроенными значками и пользовательскими значками.

0 голосов
/ 19 марта 2010

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html

"Объект контроллера навигации теперь управляет необязательной панелью инструментов в своей иерархии представления. При отображении эта панель инструментов получает свой текущий набор элементов из свойства toolbarItems активного контроллера представления."

Вы пытались создать подкласс UITableViewController для своего представления таблицы и настроить его с помощью соответствующего свойства toolbarItems?

0 голосов
/ 19 марта 2010

Может быть, вы можете использовать конструктор интерфейса, чтобы избежать этого, однако это будет медленнее

...