4

Я работаю над проектом, который я уже выпустил с iOS-7. Но теперь, когда лист действий создает проблему, я теперь реализую UIAlertController. Ниже приведен код, который я использую для отображения UIAlertController с UIPicker.Как добавить UIDatePicker в UIAlertController в iOS8?

alertController = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleActionSheet]; 

     UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"" style:UIAlertActionStyleDefault handler:nil]; 
     [alertController addAction:alertAction]; 
     [alertController addAction:alertAction]; 
     [alertController addAction:alertAction]; 
     [alertController addAction:alertAction]; 
     [pickerToolbar setFrame:CGRectMake(0, 0, self.view.frame.size.width-20, 44)]; 
     [alertController.view addSubview:pickerToolbar]; 
     [alertController.view addSubview:picker]; 

     [alertController.view setBounds:CGRectMake(0, 0, self.view.frame.size.width, 485)]; 
     [self presentViewController:alertController animated:YES completion:nil]; 

Но я не могу добавить datepicker в него. Он не работает так же, как обычный сборщик, и приложение зависает. Пожалуйста, совет для любого образца кода для добавления UIDatePicker в UIAlertController. Заранее спасибо

ответ

5

Добавление UIDatePicker к экрану действий было обескуражено Apple все время. Начиная с iOS 7, Apple внедрила использование встроенного выбора даты (см., Как это делается в приложении «Календарь»).

Если вам удалось взломать обходной путь с помощью UIAlertController, возможно, он может снова сломаться в будущих выпусках iOS.

+1

Может быть, вы должны дать пример даты рядного подборщика – Raptor

+1

@Raptor, выбор даты рядного стандартно, как показан в приложение для календаря. Или обратитесь к этому: http://stackoverflow.com/questions/18973573/ios-7-how-to-display-a-date-picker-in-place-in-a-table-view – Rick

0

Вот мой код, который испытывается на обоих прошивкой 7 и IOS 8

- (id)initWithDatePicker:(NSString*)title parentView:(UIView*)parentView { 
    self = [super init]; 
    if (self) { 
     datePickerView = [[UIDatePicker alloc] init]; 
     datePickerView.datePickerMode = UIDatePickerModeDateAndTime; 
     if (IS_IOS8_AND_UP) { 
      alertViewController = [UIAlertController 
            alertControllerWithTitle:EMPTY_STRING 
            message:title 
            preferredStyle:UIAlertControllerStyleActionSheet]; 
      UIView* aboveBlurLayer = alertViewController.view.subviews[0]; 
      [aboveBlurLayer addSubview:datePickerView]; 
      [aboveBlurLayer setWidth:SCREEN_WIDTH - 16]; 
      [datePickerView setWidth:SCREEN_WIDTH - 16]; 
      [alertViewController.view setWidth:SCREEN_WIDTH - 16]; 
      [alertViewController.view setBackgroundColor:[UIColor whiteColor]]; 

      UIAlertAction* alertAction = 
      [UIAlertAction actionWithTitle:EMPTY_STRING 
            style:UIAlertActionStyleDefault 
            handler:nil]; 
      [alertViewController addAction:alertAction]; 
      [alertViewController addAction:alertAction]; 
      [alertViewController addAction:alertAction]; 
      [alertViewController addAction:alertAction]; 

      [datePickerView setBackgroundColor:[UIColor whiteColor]]; 
      [aboveBlurLayer addSubview:datePickerView]; 
     } else { 
      actionSheet = [[UIActionSheet alloc] initWithTitle:title 
                 delegate:self 
              cancelButtonTitle:nil 
             destructiveButtonTitle:nil 
              otherButtonTitles:nil]; 

      [actionSheet addSubview:datePickerView]; 
     } 

     [self addToolBar]; 
     isDatePicker = YES; 
     parent = parentView; 
    } 
    return self; 
} 

На панели инструментов я две кнопки Готово и Отмена На Готово я отправить обратно вызов через делегата с выбранной датой и отменить Я увольняюсь. Этот код как для прошивки 7 и 8 прошивки

4

это работает для меня

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n" message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 
UIDatePicker *picker = [[UIDatePicker alloc] init]; 
[picker setDatePickerMode:UIDatePickerModeDate]; 
[alertController.view addSubview:picker]; 
[alertController addAction:({ 
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     NSLog(@"OK"); 
     NSLog(@"%@",picker.date); 
    }]; 
    action; 
})]; 
UIPopoverPresentationController *popoverController = alertController.popoverPresentationController; 
popoverController.sourceView = sender; 
popoverController.sourceRect = [sender bounds]; 
[self presentViewController:alertController animated:YES completion:nil]; 
+0

в iPhone и iOS 9 , 'UIDatePicker' шире, чем' UIPopoverPresnetationController'. Ширину выбора даты следует отрегулировать. – Raptor

+1

Что такое 'sender'? – khurramengr

+0

Где вы используете 'popoverController'? –

-1

чистого способ сделать это в Swift 2:

let vc = UIAlertController(title: "Pickup time", message: nil, preferredStyle: .Alert) 
     vc.addTextFieldWithConfigurationHandler({ (textfield) -> Void in 
      let datepicker = UIDatePicker() 
      // add delegate ... here 

      textfield.inputView = datepicker 
     }) 
     vc.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
     vc.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 
     presentViewController(vc, animated: true, completion: nil) 
+0

Спасибо, но не спасибо, результаты уродливые. –

4

Для iOS9 + Swift кода здесь.

Добавить цель к вашей кнопке даты или другому виду.

 dateBtn.addTarget(self,action: #selector(YourViewController.dateSelect(_:)),forControlEvents: UIControlEvents.TouchDown) //my date button  


    func dateSelect(sender:UIButton) { 


    if (UI_USER_INTERFACE_IDIOM() == .Phone) 
    { 

     //init date picker 
     self.datePicker = UIDatePicker(frame: CGRectMake(0, 0, self.view.frame.size.width,260)) 
     self.datePicker.datePickerMode = UIDatePickerMode.Date 

     //add target 
     self.datePicker.addTarget(self, action: #selector(YourViewController.dateSelected(_:)), forControlEvents: UIControlEvents.ValueChanged) 

     //add to actionsheetview 
     if(UIDevice.currentDevice().systemVersion >= "8.0") 
     { 

      let alertController = UIAlertController(title: "Date Selection", message:" " , preferredStyle: UIAlertControllerStyle.ActionSheet) 

      alertController.view.addSubview(self.datePicker)//add subview 

      let cancelAction = UIAlertAction(title: "Done", style: .Cancel) { (action) in 

       self.dateSelected(self.datePicker) 
       self.tableView.reloadData() 

      } 

      //add button to action sheet 
      alertController.addAction(cancelAction) 


      let height:NSLayoutConstraint = NSLayoutConstraint(item: alertController.view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 300) 
      alertController.view.addConstraint(height); 

      self.presentViewController(alertController, animated: true, completion: nil) 

     } 


    } 

} 


//selected date func 
func dateSelected(datePicker:UIDatePicker) 
{ 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle 

    let currentDate = datePicker.date 
    let day = currentDate.day() 
    let month = currentDate.month() 
    let year = currentDate.year() 

    let date = "\(day)/\(month)/\(year)" 

    print(date) 

} 
0

@idris код в swift3

Func dateSelect() {

//init date picker 
    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 260)) 
    datePicker.datePickerMode = UIDatePickerMode.date 

    //add target 
    datePicker.addTarget(self, action: #selector(dateSelected(datePicker:)), for: UIControlEvents.valueChanged) 

    //add to actionsheetview 


    let alertController = UIAlertController(title: "Date Selection", message:" " , preferredStyle: UIAlertControllerStyle.actionSheet) 

    alertController.view.addSubview(datePicker)//add subview 

    let cancelAction = UIAlertAction(title: "Done", style: .cancel) { (action) in 

     self.dateSelected(datePicker: datePicker) 


    } 

    //add button to action sheet 
    alertController.addAction(cancelAction) 


    let height:NSLayoutConstraint = NSLayoutConstraint(item: alertController.view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 300) 
    alertController.view.addConstraint(height); 

    self.present(alertController, animated: true, completion: nil) 

} 


//selected date func 
@objc func dateSelected(datePicker:UIDatePicker) { 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = DateFormatter.Style.short 

    let currentDate = datePicker.date 

    print(currentDate) 

}