UIBarButtonItem被禁用,但具有正常的颜色

我有一个UIBarButtonItem的问题。 我使用外观代理来为状态NormalDisabled设置颜色,我在UIViewControllerviewDidLoad方法中做这个。 但是,即使禁用该button,该button也会获得“ Normal颜色(由于未调用IBAction方法,该button肯定被禁用)。

问题类似于这个禁用的uibarbuttonitem的文本颜色总是正常状态的颜色 ,但是,这里发布的解决scheme不适用于我。

我的应用程序是用于iOS 8.2,我正在使用Xcode 6.2

有任何想法吗?

编辑 :我不知道这是否有助于find解决scheme,但是当我使用initWithImage:创build我的buttoninitWithImage:而不是initWithTitle:一切似乎工作正常。 这可能是一个苹果的错误?

迅速

如果有人在寻找如何快速改变barbuttonitem禁用状态的外观。 干得好。

 barButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.grayColor()], forState: UIControlState.Disabled) 

用下面的code检查。

 - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem * btnTemp = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnDone_Click:)]; [btnTemp setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor lightGrayColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:16.0f]} forState:UIControlStateNormal]; [btnTemp setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blueColor], NSFontAttributeName:[UIFont systemFontOfSize:16.0f]} forState:UIControlStateDisabled]; [self.navigationItem setRightBarButtonItem:btnTemp]; } - (void)btnDone_Click : (id)sender { UIBarButtonItem * button = (UIBarButtonItem *)sender; [button setEnabled:FALSE]; [self performSelector:@selector(enableButton:) withObject:sender afterDelay:2.0f]; } - (void)enableButton : (id)sender { UIBarButtonItem * button = (UIBarButtonItem *)sender; [button setEnabled:TRUE]; } 

所以我终于设法得到这个工作,因为它应该,而问题是,我设置UIBarButtonItems的颜色两次,一次使用[navBar setTintColor:]和一次使用外观代理。 只留下外观代理解决了这个问题。

您可能已经为.Normal状态设置了条形button项目标题文本属性,并且还需要将其设置为.Disabled状态。

有两种方法可以解决这个问题,一种是在条形图button项实例上设置标题文本属性,另一种是在使用外观代理时。

单一实例:

 saveButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled) 

外观代理:

 UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([MyNavigationController.self]).setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled)