6

アラート ビューに日付ピッカーを追加しようとしています。ボタンのクリックに基づいて画面にアニメーションを追加できます。ブラック ボックスは表示されますが、日付ピッカーは表示されません。

これが私がこれまでに持っているものです....

- (IBAction)showDatePicker {
    CGRect frame = CGRectMake(200, self.view.frame.size.height, self.view.frame.size.width, 0);  //CGRectMake(225, 145, 260, 125);
    UIPickerView *datePicker = [[UIPickerView alloc] initWithFrame:frame];
    UIAlertView *showDateAlert = [[UIAlertView alloc]
                                  initWithTitle:@"Enter the Code Date"
                                  message:@"Sample message"
                                  delegate:self
                                  cancelButtonTitle:@"Cancel"
                                  otherButtonTitles:@"Update", nil];

    [self.view addSubview:datePicker];
    [UIView beginAnimations:@"slideIn" context:nil];
    [datePicker setCenter:CGPointMake(datePicker.frame.origin.x, self.view.frame.size.height - datePicker.frame.size.height/2)];
    [UIView commitAnimations];
}

動作しているように見える例を見つけましたが、アラート ボックスにダイアログやボタンが表示されず、日付ピッカー自体だけが表示されます。ここで何か不足していますか?

- (IBAction)showDatePicker {
    CGRect frame = CGRectMake(225, self.view.frame.size.height, self.view.frame.size.width, 125);
    UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:frame];
    datePicker = [[UIDatePicker alloc] init];
    datePicker.datePickerMode = UIDatePickerModeDate;

    [datePicker setDate:[NSDate date]];

    UIAlertView *alert;
    alert = [[UIAlertView alloc]
             initWithTitle:@"Enter the Code Date"
             message:@"Sample message"
             delegate:self
             cancelButtonTitle:@"Cancel"
             otherButtonTitles:@"Update", nil];
    alert.delegate = self;
    [alert addSubview:datePicker];
    [alert show];
}
4

7 に答える 7

3

いくつかの理由から、これはこれを達成する方法ではないと言っているコメンターに同意します。まず、警告ビューが常に表示されるのを好む人はいません。第二に、あなたの状況には当てはまりません.最終的にアプリが拒否される可能性があります. Apple はUIAlertView、ビュー階層を非公開として言及するクラス リファレンスの文言を変更しました。そして、私たちは皆、アップルがあなたが個人的なことをいじくり回すことについてどのように感じているかを知っています。

UIAlertView クラス参照から:

UIAlertView クラスはそのまま使用することを意図しており、サブクラス化はサポートしていません。このクラスのビュー階層は非公開であり、変更してはなりません。

しかし、これは非公開アプリだとおっしゃっているので、ここに行きます。AUIAlertViewは単なるUIViewサブクラスです。したがって、フレームと境界のすべてのルールが引き続き適用されます。ピッカーのフレームとアラートの境界を調整して日付ピッカーを絞り込む方法の基本的なサンプルを次に示します。

// Create alert
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
// Show alert (required for sizes to be available)
[alert show];
// Create date picker (could / should be an ivar)
UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(10, alert.bounds.size.height, 320, 216)];
// Add picker to alert
[alert addSubview:picker];
// Adjust the alerts bounds
alert.bounds = CGRectMake(0, 0, 320 + 20, alert.bounds.size.height + 216 + 20);

編集

コメントと「ビューにビューを追加するにはどうすればよいですかUIAlertView」という質問の多くに対する新しい回答の両方で指摘されているように、この方法は iOS7 以降では機能しなくなりました。これは、これが根本的に悪い考えであることの証拠として実際に取られるべきです。

setValue:forKey:また、Apple のプライベート ビュー階層を変更できないという「問題」に対する一般的に流通している「解決策」でのの使用にも注意してください。setValue:forKey:プライベート API スキャナーの関心を引くメソッドの 1 つです。ドキュメントとヘッダーで検索しaccessoryViewてください。UIAlertViewドキュメントにはありません。_accessoryViewヘッダー内の唯一の関連項目は、としてマークされた ivar という名前@privateです。

繰り返しになりますが、社内またはプライベートアプリの場合は大丈夫だと思いますが、大丈夫です。

于 2012-08-28T22:11:09.677 に答える
3

あなたはこの答えを気に入らないでしょうが、私の提案は次のとおりです。UIAlertView は、独自のサブビューを追加するためのものではありません。それをしている人々の例は、間違った行動の例です。必要なピッカー、テキスト、ボタンなどを含む独自のビューを作成し、何らかの形で表示します。たとえば、独自のView Controllerを介してモーダルに表示できpresentModalViewController:animated:ますpresentViewController:animated:completion:。iPad を使用している場合は、ポップオーバーを使用できます (重要な場合はモーダルにすることができます)。

于 2012-08-28T20:29:19.897 に答える
2

これは私にとってうまくいったものです(iOS7を使用)。これを前に呼び出します[alertView show]:

[alertView setValue:customContentView forKey:@"accessoryView"];

例:

UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"TEST" message:@"subview" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil];
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
v.backgroundColor = [UIColor yellowColor];
[av setValue:v forKey:@"accessoryView"];
[av show];

ソース: UIAlertView カスタマイズの iOS 7 UIDatePicker

于 2014-05-18T18:31:33.907 に答える
2

これは、ios7以降で機能しています。

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Select Date" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(10, alert.bounds.size.height, 320, 216)];
[alert addSubview:picker];
alert.bounds = CGRectMake(0, 0, 320 + 20, alert.bounds.size.height + 216 + 20);
[alert setValue:picker forKey:@"accessoryView"];
[alert show];
于 2015-01-21T11:22:56.023 に答える