无法更改 UIBarButtonItem

Posted

技术标签:

【中文标题】无法更改 UIBarButtonItem【英文标题】:Unable to change UIBarButtonItem 【发布时间】:2014-03-21 08:46:42 【问题描述】:

**Background** 当我的应用加载时,UINavigationController 会以编程方式添加并给出 leftBarButtonItemrightBarButtonItem。在启动期间会检查是否需要新数据,如果需要,则运行一个方法从我们的 Web 服务器获取新数据。在此期间,rightBarButtonItem 更改为 UIActivityIndicatorView,它将显示旋转活动指示器。数据下载完成后,rightBarButtonItem 返回到UIBarButtonItem。这很好用。

在另一个UIViewController 上,我需要允许用户手动获取新数据并将他们的数据发送给我们。在此期间,我需要 rightBarButtonItem 像以前一样更改为UIActivityIndicatorView。但是当我尝试这样做时,数据下载正常,但rightBarButtonItem 永远不会改变。

我认为我的问题可能与我无法引用 UINavigationController 及其导航项有关。

**代码** 我的第一个 UIViewController's 实现,其中更改了 rightBarButtonItem:

-(void)statusIsLoading
    UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    uiLoading.hidesWhenStopped = YES;
    NSLog(@"Start animating");
    [uiLoading startAnimating];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:uiLoading];   

-(void)statusFinishedLoading
    UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    uiLoading.hidesWhenStopped = YES;
    [uiLoading stopAnimating];

    UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Settings.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings:)];
    self.navigationItem.rightBarButtonItem = showSettingsButton;

**我尝试过的** 我尝试在第二个 UIViewController 中设置 self.navigationItem.rightBarButtonItem 但这没有任何作用。我还尝试运行从实例化类中调用上述两种方法的方法:

    InitViewController *ivcInstance = [[InitViewController alloc] init];
    [ivcInstance performUpdate];

这可以很好地运行“performUpdate”代码,“performUpdate”方法称为“statusIsLoading”和“statusFinishedLoading”方法,但rightBarButtonItem 没有改变。

我认为这里缺少一些非常简单的东西。谢谢。

**Edit** 我刚刚尝试在第二个 UIViewController 的 pageLoad 上检查 rightBarButtonItem 的当前值,它似乎为零:

UIBarButtonItem *newItem = self.navigationItem.rightBarButtonItem;

这里 newItem = nil。我没有定位正确的导航项吗?它应该是“自我”以外的东西吗?

**编辑 2**

在第二个 UIViewController 中,我可以更改 navigationBar 的属性:

[self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:0.6 green:0.01 blue:0.36 alpha:2.0f]];

但如果我尝试对 barButtonItem 进行相同操作,则没有任何反应,这是为什么呢?

[self.navigationController.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithCustomView:uiLoading]];

与:

[self.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithCustomView:uiLoading]];

【问题讨论】:

【参考方案1】:

在您的statusFinishedLoading 中有一些未使用的代码,如下所示

-(void)statusFinishedLoading

    /*UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    uiLoading.hidesWhenStopped = YES;
    [uiLoading stopAnimating];*/ //These are unused codes.

    UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Settings.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings:)];
    self.navigationItem.rightBarButtonItem = showSettingsButton;

同样将NSLog放入statusFinishedLoading方法中,检查该方法是否被调用。

谢谢!

【讨论】:

嗨,实际上需要该代码来停止 UIActivityIndi​​catorView 的动画 - ([uiLoading stopAnimating];)。我可能会在这些方法之外声明指标。我已经逐步完成了代码,statusFinishedLoading 确实会触发,没有异常或错误。 你设置了self.navigationItem.rightBarButtonItem = nil;并检查旧的条形按钮是否被移除。 是的,我已经在第二个 UIViewController 中尝试过了,它没有删除 rightBarButtonItem。【参考方案2】:

尝试在主线程块中设置 rightBarButtonItem。收到响应后,它不应阻塞 UI。

-(void)statusFinishedLoading

    UIActivityIndicatorView *uiLoading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    uiLoading.hidesWhenStopped = YES;
    [uiLoading stopAnimating];

    UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Settings.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings:)];

    //Use a block to set the rightBarButton.
    dispatch_async(dispatch_get_main_queue(), ^
        self.navigationItem.rightBarButtonItem = showSettingsButton;
    );

希望这能解决问题。

编辑:您需要在情节提要中创建一个 UINavgationitem,将 outlet 连接到 .h 文件并将其命名为 statusNavigationItem,然后引用此 navigationItem 对象来设置 rightBarButton。

【讨论】:

我刚刚尝试了您的想法(以及它的变体,例如将此调用放在有问题的 UIViewController 而不是这些方法所在的 UIVC 上。仍然没有乐趣。我只是注意到 self.navigationItem.rightBarButtonItem =当我在第二个 VC 中检查它时为零。 在这种情况下,在 viewController 上创建一个 UINavigationItem 对象并相应地连接出口。 这样说的有道理,不过我是一个 obj-c 菜鸟——我需要做什么? 我的 UINavigationController 在应用程序加载时以编程方式添加。在故事板中,我的 UIVC 都没有导航控制器,这有关系吗?在故事板中添加一个会影响已经存在的导航控制器吗? 尝试正确访问 navigationItem,因为 .navigationItem...self.navigationItem 不会到处都有引用。

以上是关于无法更改 UIBarButtonItem的主要内容,如果未能解决你的问题,请参考以下文章

“无法保存对SAM权限所做的更改”对这样的限制怎么突破

更改布尔值时无法在 SwiftUI 中更改按钮文本

SwiftUi - 背景无法更改/无法访问

BIOS下UEFI选项灰色无法更改图解

无法更改 UILabel 文本颜色

绕过/更改“您所做的更改可能无法保存”提示