После многих часов, я думаю, что я пришел к обходному пути. Я обнаружил это решение, потому что у меня было какое-то интересное поведение, которое бы переключило цвет кнопок, которые будут работать, но установив кнопку tint прямо в viewDid/Will/что бы не получилось. Разница заключается в том, что кнопки должны были быть созданы и установлены на navigationItem через некоторое время после вызова viewDidLoad.
Короче говоря, воссоздавая кнопку, установив кнопку оттенок, и обновление navigationItem в следующем UINavigationControllerDelegate метод сделал трюк:
- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
Для того, чтобы сделать это максимально прозрачным, чтобы мое приложение, как это возможно, Я использовал следующий делегат, который будет искать метод в контроллере представления и вызывать его в нужное время:
iOS7ButtonTintWorkAround.h:
@interface RMSiOS7ButtonTintWorkAround : NSObject <UINavigationControllerDelegate>
@property (nonatomic, strong) RMSiOS7ButtonTintWorkAround* preventGC;
- (id)initWithNavigationController:(UINavigationController*)navigationController;
@end
iOS7ButtonTintWorkAround.m:
#import "iOS7ButtonTintWorkAround.h"
@implementation iOS7ButtonTintWorkAround
NSObject<UINavigationControllerDelegate>* _delegate;
- (id)initWithNavigationController:(UINavigationController*)navigationController
{
self = [super init];
if (self) {
_delegate = [navigationController delegate];
[navigationController setDelegate:self];
_preventGC = self;
}
return self;
}
- (void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if(_delegate) {
[_delegate navigationController:navigationController willShowViewController:viewController animated:animated];
}
}
- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if(_delegate) {
[_delegate navigationController:navigationController willShowViewController:viewController animated:animated];
}
if([viewController respondsToSelector:@selector(iOS7SetBarButtonTint)]) {
[viewController performSelector:@selector(iOS7SetBarButtonTint)];
}
}
@end
Поскольку свойство делегат не сильная ссылка, нужно сделать что-то, чтобы не допустить делегата от того GC'd. Я не создаю много UINavigationControllers, чтобы я мог жить с утечкой, но если кто-нибудь может предложить способ сохранить делегата только до тех пор, пока его UINavigationController, мне было бы интересно узнать его?
Можете ли вы включить картинку о том, как она выглядит на ios 7? –
Можете попробовать изменить оформление заказа? Сначала добавьте кнопку, затем установите цвет оттенка?Возможно, попробуйте установить tintColor в 'viewDidLoad', если вы этого не сделаете. 6.1 Поддержка SDK в iOS 7 далека от совершенства, поэтому настройка может помочь. –