无法将UIBarButtonItem添加到工具栏

8

在查看了每一个stackoverflow上关于这个问题的解决方案之后,对我来说仍然非常令人沮丧地无法工作。

//UIBarButtonItem declaration
UIBarButtonItem* button1 = [[UIBarButtonItem alloc] initWithTitle:@"Button Text" 
style:UIBarButtonItemStyleBordered target:self action:@selector(myAction)];

//method 1
[self setToolbarItems:[NSArray arrayWithObjects: button1, nil] animated:YES];

//method 2
[self.navigationController.toolbar setItems:[NSArray arrayWithObject:button1]];

//method 3
self.navigationController.toolbarItems = [NSArray arrayWithObject:button1];

//displaying toolbar
[self.navigationController setToolbarHidden:NO];

以上所有方法都不能在工具栏上显示按钮 - 我只得到一个空白的工具栏。我是否忽略了什么明显的东西?


1
self.navigationController.toolbar 是空的还是非空的? - Raptor
非空,日志结果:<UIToolbar: 0x81e23e0; frame = (0 460; 320 44); hidden = YES; autoresize = W+TM; layer = <CALayer: 0x81e24a0>> - Allen
由于某些原因,我可以将按钮添加到作为子视图添加的UIToolBar的单独实例中,但我无法修改uinavigationcontroller的内置工具栏。 - Allen
4个回答

5
移动
//UIBarButtonItem declaration
UIBarButtonItem* button1 = [[UIBarButtonItem alloc] initWithTitle:@"Button Text" 
style:UIBarButtonItemStyleBordered target:self action:@selector(myAction)];

//method 1
[self setToolbarItems:[NSArray arrayWithObjects: button1, nil] animated:YES];

//displaying toolbar
[self.navigationController setToolbarHidden:NO];

viewDidAppear:(BOOL)animated方法中,UINavigationController会获取其管理的UIViewController的工具栏项目。


出于某种原因,我可以将按钮添加到作为子视图添加的UIToolBar的单独实例中,但我无法修改uinavigationcontroller的内置工具栏。 - Allen
天啊,我真是太蠢了。我知道我在做一些愚蠢的错误。在我的代码底部,我不小心覆盖了方法-(void)setToolbarItems:(NSArray *)toolbarItems animated:(BOOL)animated {},并将其留空,所以我放在上面的任何东西都没有起作用! - Allen

3

使用

self.toolbarItems=[NSArray arrayWithObject:button1]

1
理论上来说,它应该与setToolbarItems方法相同。 - Allen
1
你正在将工具栏项添加到 navigationController.toolbarItems,但我已经使用了 self.toolbarItems 来添加项。你代码的另一部分是正确的。只需将项设置为 self.toolBarItems(视图控制器的工具栏),然后 toolBarItems 就会可见,而不是其 navigationController 的 toolBarItems。 - R A Khan

1

在Swift 3 / iOS 10中,如果您的导航控制器只包含一个视图控制器,您可以使用以下代码来显示带有工具栏和一个条形按钮项的视图控制器:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Show navigation controller’s built-in toolbar
        navigationController?.setToolbarHidden(false, animated: false)

        // Set the view controller toolbar items
        let items = [UIBarButtonItem(title: "Button Text", style: .plain, target: nil, action: nil)]
        setToolbarItems(items, animated: false)
    }

}

然而,如果您计划在导航控制器的堆栈中拥有多个视图控制器,则必须在viewWillAppear()viewWillDisappear()中调用UINavigationControllersetToolbarHidden(_:animated:)方法,以正确显示或隐藏导航控制器的内置工具栏:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set the view controller toolbar items
        let items = [UIBarButtonItem(title: "Button Text", style: .plain, target: nil, action: nil)]
        setToolbarItems(items, animated: false)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Show navigation controller’s built-in toolbar
        navigationController?.setToolbarHidden(false, animated: false)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // Hide navigation controller’s built-in toolbar
        navigationController?.setToolbarHidden(true, animated: false)
    }

}

setToolbarItems!! 这是要调用的函数。 - Phuah Yee Keat

0

对于那些寻找 Swift 版本的人,请尝试这个:

let someVC: UIViewController = ...
let someButton: UIBarButtonItem = ...
someVC.setToolbarItems([someButton], animated: true)

UINavigationController.toolbar 属性文档明确澄清了应该使用哪个 API 来设置工具栏项目:

通过与此 导航控制器 关联的 自定义视图控制器 来管理此工具栏的内容。对于导航堆栈上的每个视图控制器,您可以使用 UIViewControllersetToolbarItems:animated: 方法分配一组自定义工具栏项目。

-- UINavigationController 类参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接