【问题标题】:Problem adding UIBarButtonItems to a ToolBar将 UIBarButtonItems 添加到工具栏时出现问题
【发布时间】:2011-01-29 08:06:27
【问题描述】:

我有一个 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]; 
    }

【问题讨论】:

  • 我遇到了这个确切的问题,并且没有一个建议的解决方案对我有用。也许有人可以评论哪些事情会出错以及哪些事情会阻止工作。具体来说:Tom 的 VC 设置,Olivier 的 in-viewDidAppear 不起作用。 FWIW,我的工具栏出现,但没有按钮。 (是的,我调用了 setToolbarItems:!)
  • 编辑/跟进:我的错误。重新阅读 Tom's & Olivier 的答案并更仔细地应用他们的建议让我启动并运行。对两者都 +1。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在 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];
    }
    

    【讨论】:

    • 是的!必须调用 setToolbarHidden、setToolbarItems 和 [super viewDidAppear:]。
    • 可以设置UIBarButtonItem的位置
    【解决方案3】:

    替换这一行:

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

    用这个:

    [self setToolbarItems:arr animated:YES];

    一般来说,您应该在您推送的每个单独的视图控制器上设置toolbarItems,而不是在您的 UINavigationController 本身上。

    【讨论】:

    • 现在为什么这对我仍然不起作用,这似乎是一个完美的答案......
    【解决方案4】:

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

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

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

    【讨论】:

    • 我正在继承 UITableViewController。 “适当的工具栏项”是什么意思?我也试过:[self setToolbarItems:arr animated:YES];但这仍然行不通。
    • 我对这个答案投了反对票,因为在我看来,Olivier 已经阅读了文档并且仍然遇到问题 - 这就是他来这里寻求建议的原因。此外,虽然这对 Olivier 没有帮助,但 Tom 的回答解决了我的问题。
    【解决方案5】:

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

    【讨论】:

    • 但是我应该在哪里添加 UIToolBar。我无法将它添加到我的 UITableViewController
    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多