10

Я получаю следующий сбой, когда я представляю MFMailComposeViewController:MFMailComposeViewController Сбои из-за глобальные свойства Внешнего вида на iOS6

2013-11-08 11:04:05.963 <redacted>[7108:1603] *** Assertion failure in NSDictionary *_UIRecordArgumentOfInvocationAtIndex(NSInvocation *, NSUInteger, BOOL)(), /SourceCache/UIKit/UIKit-2380.17/UIAppearance.m:1118 
2013-11-08 11:04:06.032 <redacted>[7108:1603] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unknown key, "NSColor" in title text attributes dictionary' 

я отслеживал его вниз к следующей настройке внешнего вида в моем application:didFinishLaunchingWithOptions: методе AppDelegate в:

 [[UINavigationBar appearance] setTitleTextAttributes: 
      @{NSForegroundColorAttributeName : [UIColor whiteColor]}]; 

Комментируя эту строку из делает трюк, но разрушает остальную часть приложения, так что я пытался специально установки titleTextAttributes в пустой словарь для MFMailComposeViewController:

Попытка # 1

 [[UINavigationBar appearanceWhenContainedIn: 
      NSClassFromString(@"MFMailComposeViewController"), nil] 
      setTitleTextAttributes:@{ }]; 

Это приводит к тому же аварии. И

 [[UINavigationBar appearanceWhenContainedIn: 
      NSClassFromString(@"MFMailComposeViewController"), nil] 
      setTitleTextAttributes:nil]; 

также приводит к такому же сбою.

Попытка # 2

Я заметил, что MFMailComposeViewController является UINavigationController, поэтому, возможно, глобальные настройки внешнего вида локализованы UIViewControllers внутри UINavigationController. Я собрал некоторый код, чтобы выяснить, что вид контроллеров внутри MFMailComposeViewController:

 for (UIViewController *viewController in mailViewController.viewControllers) { 
      NSLog(@"%@", NSStringFromClass([viewController class])); 
     } 

Какие результаты на выходе:

2013-11-08 11:04:05.936 <redacted>[7108:907] MFMailComposeInternalViewController 

Так что я попытался (хотя это плохая практика, чтобы полагаться на Apple, частные контроллеры вид):

 [[UINavigationBar appearanceWhenContainedIn: 
      NSClassFromString(@"MFMailComposeViewController"), nil] 
      setTitleTextAttributes:@{ }]; 

И

 [[UINavigationBar appearanceWhenContainedIn: 
      NSClassFromString(@"MFMailComposeViewController"), nil] 
      setTitleTextAttributes:nil]; 

Но это все равно приводит к такому же сбою!

Попытка # 3

 // right before instantiating the MFMailComposeViewController 
     [[UINavigationBar appearance] setTitleTextAttributes:@{ }]; 

И

 [[UINavigationBar appearance] setTitleTextAttributes:nil]; 

Затем восстановление глобальных свойств внешнего вида в завершение блока dismissViewController:animated:completion:

Однако этот подход не работает. Кто-нибудь знает, как установить titleTextAttributes на глобальный внешний вид UINavigationBar без сбоя MFMailComposeViewController?

ответ

21

Попробуйте использовать UITextAttributeTextColor вместо NSForegroundColorAttributeName.

+0

Человек, я не могу поверить, что это было что-то такое немое. Это одно из тех перечислений, которые продолжают двигаться вперед и назад через релизы iOS; Я не могу держать это прямо в моей голове. – paulrehkugler

+0

О, Господи, спасибо, Джонатан! 20 человеко-часов отладки с этим решены. –

+0

Я хотел бы добавить, что та же проблема возникает с QLPreviewController. Он сбой при использовании UIAppearance и NSForegroundColorAttributeName. Использование устаревшего UITextAttributeTextColor отлично работает. – Yanik

0

Единственный способ, который я смог решить, состоял в том, чтобы создать [[UINavigationBar appearanceWhenContainedIn:] setTitleTextAttributes:] для каждого из моих UIViewControllers. К счастью, это было довольно просто, потому что все мои пользовательские контроллеры представлений поступают из 4 подклассов контроллера.

Редактировать: см. this answer, потому что я тупой.

+0

Вы отправили ошибку с яблоком? – nielsbot

2

Просто расширяет UINavigationController класс

@interface MyNavigationController : UINavigationController 
@end 

заменить весь ваш класс UINavigationController с нового подкласса и [appearanceWhenContainedIn:] в ваше приложение делегат

[UINavigationBar appearanceWhenContainedIn:[MyNavigationController class], nil].titleTextAttributes = @{ NSForegroundColorAttributeName : [UIColor whiteColor] }; 

после этого ваше приложение не будет врезаться.

+0

Я предпочитаю это решение, поскольку оно более архитектурно корректно. – kelin

Смежные вопросы