私は新しい UIAlertController を認識していますが、UIViewController を作成し、UIPickerView をサブビューとして追加し、モーダルに表示する以外の解決策を見たことがありません。これはおそらく、デリゲートを追加して情報を渡すことを意味します:(
内部にピッカーがある UIAlertController を使用する例を誰でも投稿できますか? すべて同じコントローラー内にありますか?
ありがとう
私は新しい UIAlertController を認識していますが、UIViewController を作成し、UIPickerView をサブビューとして追加し、モーダルに表示する以外の解決策を見たことがありません。これはおそらく、デリゲートを追加して情報を渡すことを意味します:(
内部にピッカーがある UIAlertController を使用する例を誰でも投稿できますか? すべて同じコントローラー内にありますか?
ありがとう
iOS8 では、ActionSheetPicker-3.0が日付ピッカーやその他のピッカーに最適なソリューションです。
DatePicker を UIActionSheet に埋め込まないでください。iOS 7 以降、UIActionSheet はカスタム サブビューを保持することは想定されていません。iOS 8 では、ActionSheet に追加されたサブビューが表示されないことを保証できます。
代わりに、ActionSheet をシミュレートするためにできることは次のとおりです (以下は、下からアニメーション化し、その上にボタンがある UIToolbar を保持する Date Picker の例です)。
2 つのプロパティを作成します。
@property (strong, nonatomic) UIDatePicker *theDatePicker;
@property (strong, nonatomic) UIView *pickerView;
ピッカーを作成し、UIView に埋め込んで表示します。
-(void) createDatePickerAndShow {
UIToolbar *controlToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, pickerView.bounds.size.width, 44)];
[controlToolbar sizeToFit];
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *setButton = [[UIBarButtonItem alloc] initWithTitle:@"Set" style:UIBarButtonItemStyleDone target:self action:@selector(dismissDateSet)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelDateSet)];
[controlToolbar setItems:[NSArray arrayWithObjects:spacer, cancelButton, setButton, nil] animated:NO];
[theDatePicker setFrame:CGRectMake(0, controlToolbar.frame.size.height - 15, theDatePicker.frame.size.width, theDatePicker.frame.size.height)];
if (!pickerView) {
pickerView = [[UIView alloc] initWithFrame:theDatePicker.frame];
} else {
[pickerView setHidden:NO];
}
CGFloat pickerViewYpositionHidden = self.view.frame.size.height + pickerView.frame.size.height;
CGFloat pickerViewYposition = self.view.frame.size.height - pickerView.frame.size.height;
[pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
pickerViewYpositionHidden,
pickerView.frame.size.width,
pickerView.frame.size.height)];
[pickerView setBackgroundColor:[UIColor whiteColor]];
[pickerView addSubview:controlToolbar];
[pickerView addSubview:theDatePicker];
[theDatePicker setHidden:NO];
[self.view addSubview:pickerView];
[UIView animateWithDuration:0.5f
animations:^{
[pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
pickerViewYposition,
pickerView.frame.size.width,
pickerView.frame.size.height)];
}
completion:nil];
}
DatePicker を閉じるには:
-(void) cancelDateSet {
CGFloat pickerViewYpositionHidden = self.view.frame.size.height + pickerView.frame.size.height;
[UIView animateWithDuration:0.5f
animations:^{
[pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
pickerViewYpositionHidden,
pickerView.frame.size.width,
pickerView.frame.size.height)];
}
completion:nil];
}
注意が必要な最初のコメントに少し間違いがあると思います。これは編集後のコードです。
@property (strong, nonatomic) UIDatePicker *theDatePicker;
@property (strong, nonatomic) UIView *pickerView;
- (IBAction)createDatePickerAndShow:(id)sender;
次に createDatePickerAndShow ボタンにリンクします。その後、ピッカーを作成し、それを UIView に埋め込んで表示します。
//.................Edit to (IBAction)createDatePickerAndShow:(id)sender
- (IBAction)createDatePickerAndShow:(id)sender {
UIToolbar *controlToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, _pickerView.bounds.size.width, 44)];
[controlToolbar sizeToFit];
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
//............add this to disable the warning of @selector(dismissDateSet)]
#pragma GCC diagnostic ignored "-Wundeclared-selector"
UIBarButtonItem *setButton = [[UIBarButtonItem alloc] initWithTitle:@"done" style:UIBarButtonItemStyleDone target:self action:@selector(dismissDateSet)];
//...........Edit to UIBarButtonItemStylePlain that is supported in ios 8
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancelDateSet)];
[controlToolbar setItems:[NSArray arrayWithObjects: cancelButton, spacer, setButton, nil] animated:NO];
[_theDatePicker setFrame:CGRectMake(0, controlToolbar.frame.size.height - 15, _theDatePicker.frame.size.width, _theDatePicker.frame.size.height)];
if (!_pickerView) {
_pickerView = [[UIView alloc] initWithFrame:_theDatePicker.frame];
} else {
//.................here edit _pickerView
[_pickerView setHidden:NO];
}
CGFloat pickerViewYpositionHidden = self.view.frame.size.height + _pickerView.frame.size.height;
CGFloat pickerViewYposition = self.view.frame.size.height - _pickerView.frame.size.height;
[_pickerView setFrame:CGRectMake(_pickerView.frame.origin.x,
pickerViewYpositionHidden,
_pickerView.frame.size.width,
_pickerView.frame.size.height)];
[_pickerView setBackgroundColor:[UIColor whiteColor]];
[_pickerView addSubview:controlToolbar];
[_pickerView addSubview:_theDatePicker];
[_theDatePicker setHidden:NO];
[self.view addSubview:_pickerView];
[UIView animateWithDuration:0.5f
animations:^{
[_pickerView setFrame:CGRectMake(_pickerView.frame.origin.x,
pickerViewYposition,
_pickerView.frame.size.width,
_pickerView.frame.size.height)];
}
completion:nil];
}
そして、同じように DatePicker を閉じるには:
-(void) cancelDateSet {
CGFloat pickerViewYpositionHidden = self.view.frame.size.height + _pickerView.frame.size.height;
[UIView animateWithDuration:0.5f
animations:^{
[_pickerView setFrame:CGRectMake(_pickerView.frame.origin.x,
pickerViewYpositionHidden,
_pickerView.frame.size.width,
_pickerView.frame.size.height)];
}
completion:nil];
}