将UIBarButtonItems添加到ToolBar时出现问题

Oli*_*nge 12 iphone cocoa-touch objective-c uitoolbar uikit

我有一个UINavigationController,里面有一个UITableViewController.我想在底部用UIBarButtonItem显示一个ToolBar.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]; 
    }
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 47

替换此行:

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

有了这个:

[self setToolbarItems:arr animated:YES];

通常,您应该toolbarItems在您推送的每个视图控制器上设置,而不是在UINavigationController本身上设置.


Oli*_*nge 14

我在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];
}
Run Code Online (Sandbox Code Playgroud)