Что является лучшим решением для добавления UIPickerView внутри UIActionSheet в iOS8?

Я знаю о новом UIAlertController, но я не видел решения, кроме как создание UIViewController, добавление UIPickerView в качестве подпредставления и его представление модально.. что, вероятно, означает добавление делегатов для передачи информации:(

Кто-нибудь может опубликовать пример использования UIAlertController со сборщиком внутри... все в одном контроллере?

Спасибо

4 ответа

Используйте UIAlertController, предпочтительную замену для UIActionSheet. Затем добавьте UIDatePicker с помощью addSubView в UIAlertController.view вместо UIActionSheet. Установите заголовок UIAlertController так же, как вы сделали бы для UIActionSheet. Вот пример кода:

    @interface MyControllerClass() {
    @private UIDatePicker* datePicker;
    }
    @end

    @implementation MyControllerClass
    ...
    -(void) showDatePicker {
    if (!datePicker)
         datePicker = [[UIDatePicker alloc] init];



  NSString *title = UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) ? @"\n\n\n\n\n\n\n\n\n" : @"\n\n\n\n\n\n\n\n\n\n\n\n" ;
        if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1){

            //Pre iOS 8
            UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                          initWithTitle:title
                                          delegate:self
                                          cancelButtonTitle:nil
                                          destructiveButtonTitle:nil
                                          otherButtonTitles:@"OK", nil];

            [actionSheet addSubview:datePicker];
            [actionSheet setTag:ACTION_SHEET_DATEPICKER];
            [actionSheet showInView:self.aView];

        } else {

            //for iOS 8

            UIAlertController* datePickerContainer = [UIAlertController alertControllerWithTitle: title
                                                                                         message:nil
                                                                                  preferredStyle: UIAlertControllerStyleActionSheet];

            [datePickerContainer.view addSubview:datePicker];

            //Add autolayout constraints to position the datepicker
            [datePicker setTranslatesAutoresizingMaskIntoConstraints:NO];

            // Create a dictionary to represent the view being positioned
            NSDictionary *labelViewDictionary = NSDictionaryOfVariableBindings(datePicker);

            NSArray* hConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[datePicker]-|" options:0 metrics:nil views:labelViewDictionary];
            [datePickerContainer.view addConstraints:hConstraints];
            NSArray* vConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[datePicker]" options:0 metrics:nil views:labelViewDictionary];
            [datePickerContainer.view addConstraints:vConstraints];

            [datePickerContainer addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){
                [self dateSelected:nil];
            }]];

            [self presentViewController:datePickerContainer animated:YES completion:nil];

        }
      }
    }

    ...
    @end

Пожалуйста, исправляйте и улучшайте по своему усмотрению.

Для iOS8 https://github.com/skywinder/ActionSheetPicker-3.0 является лучшим решением для сборщика дат и других сборщиков.

анимация

Не вставляйте DatePicker в UIActionSheet! Начиная с iOS 7, UIActionSheet не должен содержать никаких пользовательских подпредставлений, и я могу заверить вас, что в iOS 8 любое подпредставление, добавленное в ActionSheet, не отображается!

Вместо этого вы можете сделать следующее и смоделировать ActionSheet (ниже приведен пример средства выбора даты, которое анимируется снизу, а также содержит панель UIToolbar с кнопками над ней):

Создайте два свойства:

@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];
}
Другие вопросы по тегам