12

我有一个 UINavigationController,里面有一个 UITableViewController。我想在底部显示一个带有 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]; 
    }
4

5 回答 5

47

替换这一行:

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

有了这个:

[self setToolbarItems:arr animated:YES];

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

于 2010-03-19T07:42:47.813 回答
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];
}
于 2010-03-19T10:00:20.640 回答
0

也许您可以使用界面生成器来避免这种情况,但是它会更慢

于 2010-03-19T06:29:24.530 回答
0

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

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

您是否尝试过为您的 tableview 子类化 UITableViewController 并设置适当的 toolbarItems 属性?

于 2010-03-19T07:13:31.070 回答
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];

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

于 2010-06-12T05:09:48.230 回答