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'、理由: 'RGBA または白色空間のみをサポートします。この方法はハックです。'

助言がありますか?さまざまな行をコメントアウトする試行錯誤を通じて、エラーの原因は alloc/init 行のようですが、すべての行のコメントを外すと、すべての NSLog が実行されます。されています。mailcomposer が画面に表示される前にアプリがクラッシュします。ここでアドバイスをいただければ幸いです。

            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 セパレーター スタイルを 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

実際、これは重大なバグだと思いますが、誰かがレーダーを提出しましたか?

私のように、提示するViewControllerのアピアランスプロキシで「colorWithPatternImage」をどこでも使用すると、アサーションがスローされます。

iOSは、別のサービスに切り替える前にアプリの外観を保存しようとします(これは、MFMailComposeViewControllerが行うことです。これは、アプリによって提示されるが、別のアプリによって管理される「リモートビューコントローラー」になります。プロセス)、メールアプリは外観自体を決定するため、色合いの色などが変更されます。リモートビューコントローラーの詳細については、誰かが興味を持っている場合に備えて、http: //oleb.net/blog/2012/10/remoteを参照してください。 -view-controllers-in-ios-6 /

これは失敗するようです。これはバグである必要があり、画像はエンコード可能である必要があります。

回避策は難しいかもしれません。ビューコントローラを表示する直前にパターン化された色をプレーンな色に交換しようとしましたが、少なくとも画面上で実際に再描画されて諦めていることを確認する必要があることがわかりました(パターンは実際には必要ありません)。

于 2012-10-14T03:02:31.727 に答える
4

MFMailComposeViewControllerがステートメントcolorWithPatternImageで使用されている場合にのみクラッシュすることがわかりました[[UITableView appearance]。テーブルのviewDidLoadでbackgroundとseparatorColorを設定しても問題はありませんでした。唯一の問題は、テーブルごとにこれを行う必要があることです。

[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を使用して表示しようとすると、iOS 7 でアプリがクラッシュしていました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

このスレッドは、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 に答える
1

モーダル ビューを表示するために使用される tableViewController の navBar 内の UIBarButtonItem に「colorWithPatterImage」を使用すると、同じ問題に直面しています ( MFMailComposeViewControllerは使用していません)。

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

RGBa カラーに置き換える必要がありました。

于 2013-02-11T08:43:00.503 に答える
0

これは iOS 6 のバグであり、私はそれを報告し、重複としてマークされました。だから、誰かがそのバグを早く報告してください。

于 2013-01-25T04:06:16.563 に答える