Подтвердить что ты не робот

Проблема добавления 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]; 
    }
4b9b3361

Ответ 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];

Это работает для меня с помощью "текстовых" кнопок, встроенных значков и пользовательских значков.