MFMailComposeViewController由于iOS6上的全局外观属性而崩溃

pau*_*ler 10 objective-c ios uiappearance mfmailcomposeviewcontroller

当我提出一个问题时,我遇到了以下崩溃MFMailComposeViewController:

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'
Run Code Online (Sandbox Code Playgroud)

我在AppDelegate的application:didFinishLaunchingWithOptions:方法中将其跟踪到以下外观设置:

        [[UINavigationBar appearance] setTitleTextAttributes:
            @{NSForegroundColorAttributeName : [UIColor whiteColor]}];
Run Code Online (Sandbox Code Playgroud)

注释掉该行就可以了,但是会破坏应用程序的其余部分,所以我尝试将titleTextAttributes专门设置为空字典MFMailComposeViewController:

尝试#1

        [[UINavigationBar appearanceWhenContainedIn:
            NSClassFromString(@"MFMailComposeViewController"), nil]
            setTitleTextAttributes:@{ }];
Run Code Online (Sandbox Code Playgroud)

这导致同样的崩溃.和

        [[UINavigationBar appearanceWhenContainedIn:
            NSClassFromString(@"MFMailComposeViewController"), nil]
            setTitleTextAttributes:nil];
Run Code Online (Sandbox Code Playgroud)

也导致同样的崩溃.

尝试#2

我注意到这MFMailComposeViewController是一个UINavigationController,所以也许全局外观设置本地化到UINavigationController 的UIViewControllers .我整理了一些代码来确定MFMailComposeViewController中的视图控制器:

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

这导致输出:

2013-11-08 11:04:05.936 <redacted>[7108:907] MFMailComposeInternalViewController
Run Code Online (Sandbox Code Playgroud)

所以我尝试过(尽管依赖Apple的私有视图控制器是不好的做法):

        [[UINavigationBar appearanceWhenContainedIn:
            NSClassFromString(@"MFMailComposeViewController"), nil]
            setTitleTextAttributes:@{ }];
Run Code Online (Sandbox Code Playgroud)

        [[UINavigationBar appearanceWhenContainedIn:
            NSClassFromString(@"MFMailComposeViewController"), nil]
            setTitleTextAttributes:nil];
Run Code Online (Sandbox Code Playgroud)

但这仍然导致同样的崩溃!

尝试#3

        // right before instantiating the MFMailComposeViewController
        [[UINavigationBar appearance] setTitleTextAttributes:@{ }];
Run Code Online (Sandbox Code Playgroud)

        [[UINavigationBar appearance] setTitleTextAttributes:nil];
Run Code Online (Sandbox Code Playgroud)

然后在完成块中恢复全局外观属性 dismissViewController:animated:completion:

但是,这种方法也不起作用.有没有人知道如何在全局UINavigationBar外观上设置titleTextAttributes 而不会崩溃MFMailComposeViewController?

Jon*_*ast 21

尝试使用UITextAttributeTextColor而不是NSForegroundColorAttributeName.