将UIBarButtonItems添加到ToolBar时出现问题

时间:2010-03-19 06:05:50

标签: iphone objective-c cocoa-touch uikit uitoolbar

我有一个带UITableViewController的UINavigationController。我想在底部用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]; 
    }

5 个答案:

答案 0 :(得分:45)

替换此行:

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

用这个:

[self setToolbarItems:arr animated:YES];

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

答案 1 :(得分:14)

我在Apple的documentation中发现了一个解释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];
}

答案 2 :(得分:0)

也许您可以使用界面构建器来避免这种情况,但是它会慢一些

答案 3 :(得分:0)

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

“导航控制器对象现在管理其视图层次结构中的可选工具栏。显示时,此工具栏从活动视图控制器的toolbarItems属性中获取其当前项目集。”

您是否尝试过为您的tableview子类化UITableViewController并使用相应的toolbarItems属性进行设置?

答案 4 :(得分:0)

我创建了一个视图控制器,它是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];

这适用于“文本”按钮,内置图标和自定义图标。