17

UIAlertViews[alert setValue:someView forKey:@"accessoryView"]メソッドを使用してカスタマイズすることに慣れています。これにより、カスタムの高さを持つ UIAlertViews のカスタマイズ可能なコンテンツが作成されます。ただし、iOS7 以下でのみ動作します。iOS8 ではUIAlertControllerが引き継がれ、カスタマイズできなくなりましたUIAlertView

の誤用で不可能ですUIAlertControllerか、それともどうすればいいですか? UIAlertController 内に UITableView を組み込んでいますUIAlertControllerStyleAlert

どうも。

4

4 に答える 4

36

私は今同じ問題に遭遇しました。UIAlertController のプライベート ヘッダー ( https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIAlertController.h ) を調べたところ、有望なプロパティが見つかりました。contentViewController

そして、UIAlertView の場合とまったく同じであることが判明しましaccessoryViewた。違いは、UIView ではなく、このプロパティに UIViewController を割り当てる必要があることです。

UIViewController *v = [[UIViewController alloc] init];
v.view.backgroundColor = [UIColor redColor];

[alertController setValue:v forKey:@"contentViewController"];

このコードはアラート ビューに赤いビューを表示します。幸せな UIAlertController のカスタマイズ ;)

PS。これは私有財産ですが、KVC を使用すれば App Store に関しては問題ないと思います。

編集:

これはあまり安全ではないと不満を言う人もいます。これはパブリック API ではないため、Apple はどのリリースでもこれを変更して、このメソッドが失敗する可能性があります。

クラッシュが発生した場合にアプリ全体がクラッシュしないようにするために、KVC 呼び出しをtryブロックでラップできます。プロパティが変更された場合、コントローラーはコンテンツ ビューを表示しませんが、クラッシュすることもありません。

@try {
    [alertController setValue:v forKey:@"contentViewController"];
}
@catch(NSException *exception) {
    NSLog(@"Failed setting content view controller: %@", exception);
}

この方法を本番環境で使用するのは危険な場合があるため、重要なアラートにはお勧めしません。

于 2014-11-08T17:49:24.967 に答える
1

UIAlertController カテゴリを使用して 1 行のコードでそれを行うことができ、アプリケーション内の既存のアラートを置き換えることができます。ここで確認してください

ここに画像の説明を入力

于 2016-01-17T18:22:39.320 に答える