2

iOS8 の MFMessageComposeViewController で奇妙なバグに遭遇しました。これは、自分のアプリ内でのみ再現可能です。現在、App Store でアプリに影響を与えています。このアプリは、iOS8 で実行される iOS7 SDK と、私自身のテスト デバイス (iPhone および iPad) の iOS8 SDK で構築されています。

問題は、MFMessageComposeViewController を起動すると、テキスト フィールドや [送信] ボタンのないコントローラーが表示されることです。iOS7 と iOS8 の間でコードを変更していないので、なぜこれが起こっているのかわかりません。コード自体は非常に単純です。

MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
picker.messageComposeDelegate = self;
[picker setRecipients: @[@"5551112222"]];
[picker setBody: @"Test"];

[self presentViewController:picker animated:YES completion: ^{
    NSLog(@"MFMessageComposeViewController completion handler"); 
}];

これは次のようになります。

ここに画像の説明を入力

回避策として何を試すことができるかについてのアイデアはありますか? 完了ハンドラーで textField と受信者を設定しようとしました。最上位のView ControllerでbecomeFirstResponderを呼び出してみました; 運がない。繰り返しますが、これは iOS7 で完全に正常に動作していました。

編集:

MFMessageComposeViewControllerだから私はこのリンクからApple自身のサンプルコードを見つけました: https://developer.apple.com/library/ios/samplecode/MessageComposer/Listings/MessageComposerViewController_m.html

このアプリをビルドして実行すると、 がMFMessageComposeViewController完全に表示され、電話番号とテキスト フィールドの事前入力も同様に機能します。しかし、彼らのファイルを自分のアプリにコピーし、ストーリーボードをメインのストーリーボードにして、[SMS の作成] ボタンを押すと、まったく同じ問題が発生します。

ここで何が起こっているのですか?非常に混乱。メッセージ コンポーザーが正しく表示されないのは、自分のアプリの構成のせいでしょうか?

4

1 に答える 1

2

最後に、アプリの大部分を破棄した後、問題を理解することができました。結局のところ、(サブクラス化ではなく) カテゴリで UIViewController システム メソッドをオーバーライドしていたことがわかりました。

@implementation UIViewController (UIViewController_Additions)
-(BOOL)canBecomeFirstResponder {
    return YES;
}

これは iOS7 までは問題なく動作していましたが、iOS8 と `MFMessageComposeViewController. 「4歳のハックがあなたのお尻を噛むようになる」というケース

このリンクによると、この慣行はAppleによっても推奨されていません(ただし、元のAppleソースは見つかりませんでした):https://stackoverflow.com/a/14259595/145552

于 2014-09-23T23:12:53.587 に答える