7

Я хочу показать UIPickerView в UIAlertController или UIPopoverController, я новичок в iOS, пожалуйста, дайте мне пример кода здесь.хотите показать UIPickerView в UIAlertController или UIPopoverController Swift?

Я искал их, но не нашел удовлетворительных ответов. Я не хочу делать это на UIActionSheet, потому что он устарел в iOS 9. Также я хочу, чтобы это было в Swift не в Obj-C. Я попробовал приведенный ниже пример, но он не работает для меня.

http://makeapppie.com/2014/08/30/the-swift-swift-tutorials-adding-modal-views-and-popovers/

+0

Пожалуйста, ознакомьтесь с его: http://stackoverflow.com/questions/25545982/is-there-any-way-to-add-uipickerview-into-uialertcontroller-alert-or-actionshee –

+0

в приведенном выше примере «Профили» дают ошибку. не работает для меня. –

+0

Мой друг, «профиль», «пользователь» - поле другого источника. Вы должны установить соответствующее поле или удалить их. –

ответ

2

ниже код предназначен для UIAertController, который показывает uipickerview. ранее он выдавал ошибку iPad, когда я исправлял ее для iPhone. теперь он работает над обоими. iPad и iPhone.

let alertView = UIAlertController(title: "Select Launguage", message: "\n\n\n\n\n\n\n\n\n\n", preferredStyle: UIAlertControllerStyle.ActionSheet); 
    if !DeviceType.IS_IPAD{ 
    pickerView.center.x = self.view.center.x 
    } 
    alertView.view.addSubview(pickerView) 
    if DeviceType.IS_IPAD{ 
     alertView.popoverPresentationController?.sourceView = self.view 
     alertView.popoverPresentationController?.sourceRect = self.pickerView.bounds 
    } 
    let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil) 

    alertView.addAction(action) 
    presentViewController(alertView, animated: true, completion: nil) 

для выбора устройства. коды ниже:

enum UIUserInterfaceIdiom : Int 
{ 
    case Unspecified 
    case Phone 
    case Pad 
} 

struct ScreenSize 
{ 
    static let SCREEN_WIDTH   = UIScreen.mainScreen().bounds.size.width 
    static let SCREEN_HEIGHT  = UIScreen.mainScreen().bounds.size.height 
    static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) 
    static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) 
} 

struct DeviceType 
{ 
    static let IS_IPHONE_4_OR_LESS = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 
    static let IS_IPHONE_5   = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0 
    static let IS_IPHONE_6   = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0 
    static let IS_IPHONE_6P   = UIDevice.currentDevice().userInterfaceIdiom == .Phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 
    static let IS_IPAD    = UIDevice.currentDevice().userInterfaceIdiom == .Pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0 
} 
9

Ваш Базовый код Похожи:

let alert = UIAlertController(title: title, message: message, preferredStyle: .actionSheet) 
alert.isModalInPopover = true 

// Create a frame (placeholder/wrapper) for the picker and then create the picker 
let pickerFrame = CGRect(x: 17, y: 52, width: 270, height: 100) // CGRectMake(left), top, width, height) - left and top are like margins 
let picker = UIPickerView(frame: pickerFrame) 

// set the pickers datasource and delegate 
picker.delegate = self 
picker.dataSource = self 

// Add the picker to the alert controller 
alert.view.addSubview(picker) 

//Do stuff and action on appropriate object. 

Пожалуйста, ознакомьтесь с ниже ответ.

Is there any way to add UIPickerView into UIAlertController (Alert or ActionSheet) in Swift?

+0

Я пытаюсь решить эту проблему. Спасибо за ответ. если он работает для меня, я буду указывать его как правильный ответ. –

+0

@IbadUrRahman, Ok, NP. Если вам нужна помощь, не стесняйтесь обращаться ко мне. Счастливое кодирование! –

+0

Я добавляю представление выбора, чтобы предупредить, но представление сборщика не отображается в состоянии готовности. сборщик создает и работает без предупреждения, но не работает с видом предупреждения. –

2

Определение pickerView, источник данных и передать себя и попробовать этот код.

func createAlertView() { 

    let alertView = UIAlertController(title: "", message: "", preferredStyle: UIAlertControllerStyle.Alert) 

    pickerView = UIPickerView(frame: CGRectMake(0, 0, 250, 60)) 
    pickerView?.dataSource = self 
    pickerView?.delegate = self 

    alertView.view.addSubview(pickerView!) 

    let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil) 

    alertView.addAction(action) 
    presentViewController(alertView, animated: true, completion: nil) 
} 

Все остальные ответы хороши, я не понимаю, почему он не работает для вас. Добавьте свой код, может быть, мы сможем помочь.

0

Вы можете создать пользовательский UIAlertView или UIAlertViewController. Это будет содержать ваш pickerview и все, что вам нужно в вашем настраиваемом оповещении.

Сначала создайте новый .xib-файл и сделайте его размером с предупреждением. Затем введите свою графику.

Теперь сделайте быстрый файл, подкласс UIAlertView и назовите его что-то подходящее.

Новый> Файл> Cocoa Touch Подкласс

(или что-то в этом роде)

Сделайте .xib файл имя класса вашего UIAlertView.

Перетащите элементы из .xib в новый быстрый файл и назовите их соответствующим образом.

Теперь используйте вид предупреждения, а не вид предупреждения по умолчанию.

0

Если вы следуете этому коде, вы можете увидеть, что UIAlertController используется для отображения ActionSheets и/или предупреждений. Вы не должны добавлять subviews к трудному пути к ним, вы не сможете предсказать, будет ли поведение затронуто.

Также с iOS 9 UIPopoverController устарел. Но в iOS 8 UIPopoverPresentationController и его делегат, где представлены, чтобы помочь достичь того, чего вы хотите. (Узнайте о них here)

Значит, вы можете использовать это, чтобы вы сами отображали Диспетчер Picker как поппер на iPads, но не на iPhone, если я правильно помню.

Подводя итог: простой способ - создать свой собственный пользовательский вид и реализовать его по протоколу делегата. Это должно быть довольно просто. Если у вас есть больше сомнений в том, как что-то сделать на этом пути, найдите здесь в StackOverflow или отправьте новый вопрос.