27

真的,真的很奇怪的错误

我有一个在 iOS5/.1 中运行良好的应用程序,现在我在使用 iOS6 时遇到了一些转换问题,但这一个令人困惑。

我有一些启动邮件编写器的代码,并且从 iOS 6 开始,它会导致崩溃并出现以下错误:

* 断言失败 -[UICGColor encodeWithCoder:], /SourceCache/UIKit/UIKit-2372/UIColor.m:1191 2012-09-26 02:14:38.044 MyCQs Medical[2126:1b03] *由于未捕获的异常而终止应用程序' NSInternalInconsistencyException', reason: '只支持 RGBA 或 White 颜色空间,这种方法是 hack。

有什么建议么?通过反复试验注释掉各种行,似乎是导致错误的 alloc/init 行,尽管当所有行都未注释时,所有 NSLogs 都被执行,包括“present”,它表示应该调用的所有内容,已经。该应用程序在邮件撰写器出现在屏幕上之前崩溃,我非常感谢这里的任何建议

            if (indexPath.row == 3) {
               if([MFMailComposeViewController canSendMail]){
                   mailComposer = [[MFMailComposeViewController alloc]init];
                   NSLog(@"Alloc, init");
                   mailComposer.mailComposeDelegate = self;
                   NSLog(@"Set delegate");
                   NSArray *toArray = [[NSArray alloc]initWithObjects:@"john@doe.com", nil];
                   NSLog(@"To array");
                   [mailComposer setToRecipients:toArray];
                   NSLog(@"To recipients");
                   [mailComposer setSubject:@"Message from a MyCQs user!"];
                   NSLog(@"Subject");
                   NSLog(@"About to present mail composer");
                   [[mailComposer navigationBar] setTintColor:[UIColor blackColor]];
                   [self presentModalViewController:mailComposer animated:YES];
                   NSLog(@"Present");
             }
    }
4

10 回答 10

8

好的,只是部分解决方案,但它是我能想到的最好的解决方案,无需进行一些相当破坏性的代码更改。

对于将来遇到此问题的其他人,我认为这是 iOS 6 中的一个错误,当您将 UITableView separatorStyle 设置为 colorWithPatternImage 时,MFMailComposeViewController 崩溃,但是当您使用纯色时它可以正常工作,所以:

        if ([[[UIDevice currentDevice] systemVersion] floatValue] > 5.2) {
           NSLog(@"Using iOS 5x");
           [[UITableView appearance]setSeparatorColor:[UIColor colorWithRed:142.0/255.0          green:130.0/255.0 blue:76.0/255.0 alpha:1.0]];
        }
        else {
           NSLog(@"Using iOS 6x, Table view use pattern color");
           [[UITableView appearance]setSeparatorColor:[UIColor colorWithPatternImage: [UIImage imageNamed:@"dotted-line2.png"]]];
        }
于 2012-09-26T15:41:48.510 回答
5

实际上,我认为这是一个重大错误,有人提交了雷达吗?

在我看来,只要您在呈现视图控制器的外观代理中使用“colorWithPatternImage”ANYWHERE,断言就会抛出。

我认为发生的情况是 iOS 在切换到单独的服务之前尝试存储您的应用程序的外观(这是 MFMailComposeViewController 所做的,它现在是一个“远程视图控制器”,由您的应用程序呈现,但由另一个应用程序/过程),因为邮件应用程序想要确定外观本身,所以它会改变颜色等。更多关于远程视图控制器的信息,如果有人感兴趣: http: //oleb.net/blog/2012/10/remote -view-controllers-in-ios-6/

这似乎失败了。这必须是一个错误,图像应该是可编码的。

变通办法可能很难。在呈现视图控制器之前,我尝试将图案颜色换成普通颜色,但发现您至少必须确保它真的在屏幕上重新绘制并放弃(我并不真的需要图案)。

于 2012-10-14T03:02:31.727 回答
5

我的问题也是由于使用 colorWithPatternImage 但我发现它似乎只在用于 MFMailCompserViewController 上显示的元素时才会导致问题,例如:

[[UINavigationBar appearance] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"navbar"]]];
于 2013-06-30T12:02:31.570 回答
4

I've found that MFMailComposeViewController only crashes when colorWithPatternImage is used in [[UITableView appearance] statement. I've had no problem when I set the background and separatorColor in the table's viewDidLoad. The only problem is you need to do this for each table.

[self.tableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"image.png"]]];
[self.tableView setSeparatorColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"image.png"]]];
于 2012-10-02T17:11:59.103 回答
2

@coolio 是对的,它似乎在将图案颜色与任何控制器类一起使用时发生。(显然,至少是 UITabBarController 和 UITableViewController。)

我通过子类化我的标签栏控制器并使用 appearanceWhenContainedIn: 来解决这个问题。这样,您仍然可以使用您喜欢的纹理,而无需子类化 MFMailComposeViewController 或嗅探 iOS 版本等。

UIColor *tabBarBgPattern = [UIColor colorWithPatternImage:...];
[[UITabBar appearanceWhenContainedIn:[MyTabBarController class],
                                     nil]
                  setBackgroundColor:tabBarBgPattern];
于 2013-03-15T17:40:19.843 回答
1

在使用colorWithPatternImage和尝试呈现MFMailComposeViewController. 我必须从 UIImage 确定颜色,因为 UIImage 可以由用户选择,并且我想根据用户选择的图像“主题”我的应用程序。

对我来说,解决方案(尽管有点老套)是获取 UIImage 原点(0,0)的 RGBA 值,然后将其应用为背景颜色,而不是使用colorWithPatternImage.

+ (UIColor*)getUIColorFromImageAtOrigin:(UIImage*)image
{        
    // First get the image into your data buffer
    CGImageRef imageRef = [image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                                 bitsPerComponent, bytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);

    // Now your rawData contains the image data in the RGBA8888 pixel format.
    int byteIndex = (bytesPerRow * 0) + 0 * bytesPerPixel;

    CGFloat red   = (rawData[byteIndex]     * 1.0) / 255.0;
    CGFloat green = (rawData[byteIndex + 1] * 1.0) / 255.0;
    CGFloat blue  = (rawData[byteIndex + 2] * 1.0) / 255.0;
    CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0;

    UIColor *acolor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];

    free(rawData);

    return acolor;
}

现在,如果我使用它UIColor作为背景而不是colorWithPatternImage,我可以尽情分享而不会遇到这个奇怪的异常。

上述方法改编自我在这里找到的解决方案:https ://stackoverflow.com/a/1262893/1103584

于 2014-06-25T16:49:42.867 回答
1

我在 tableViewController 的导航栏中使用 UIBarButtonItem 使用“colorWithPatterImage”来显示模式视图(我没有使用MFMailComposeViewController)时遇到了同样的问题。

[[UIBarButtonItem appearance] setTintColor:[UIColor colorWithPatternImage:bgImage]];

我需要用 RGBa 颜色替换它;

于 2013-02-11T08:43:00.503 回答
1

该线程为我提供了有关如何使用 ShareKit 解决我的应用程序中的类似问题并尝试通过电子邮件发送视图图像的重要线索。现在我只为低于 6.0 的版本更改 UISwitch 外观。

我的应用程序启动时会调用此代码:

// Protect against IOS 6.0 BUG: 'NSInternalInconsistencyException', reason: 'Only support RGBA or the White color space, this method is a hack.'
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0) {
    UIImage *patternImage = [UIImage imageNamed:@"solid-colors_blue.png"];
    UIColor* switchColor = [UIColor colorWithPatternImage:patternImage];
    [[UISwitch appearance] setOnTintColor: switchColor];
}  
于 2012-11-02T19:43:14.250 回答
0

对于使用模式,您可以使用 resizableImageWithCapInsets。在 Monotouch 中,它看起来像这样:

var sba = UISearchBar.Appearance;

var img = UIImage.FromBundle("myResource.png");

if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) {
    img = img.CreateResizableImage(UIEdgeInsets.Zero, UIImageResizingMode.Tile);
    sba.BackgroundColor = UIColor.LightGray;
    sba.BackgroundImage = img;
} else {
    sba.BackgroundImage = new UIImage();
    sba.BackgroundColor = UIColor.FromPatternImage(img);
}
于 2013-09-02T13:45:35.167 回答
0

这是我报告的 iOS 6 的错误,它被标记为重复。所以,有人更早地报告了这个错误。

于 2013-01-25T04:06:16.563 回答