想在UIAlertController或UIPopoverController Swift中显示UIPickerView?

时间:2015-10-20 10:13:20

标签: ios swift uipickerview uipopovercontroller uialertcontroller

我想在UIAlertController或UIPopoverController中显示UIPickerView,我是iOS新手,请在这里给我一些示例代码。

我搜索了他们但找不到任何满意的答案。我不想在UIActionSheet上这样做,因为它在iOS 9中已被弃用。我也希望它在Swift中而不是在Obj-C中。我尝试了以下示例,但它对我不起作用。

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

5 个答案:

答案 0 :(得分:10)

您的基本代码如下:

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?

答案 1 :(得分:2)

定义pickerView,datasource并自己委托并尝试此代码。

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)
}

所有其他答案都很好,我不明白为什么它不适合你。添加您的代码也许我们可以帮助您。

答案 2 :(得分:2)

下面的代码是显示uipickerview的UIAertController。以前,当我为iPhone更正时,它会给iPad带来错误。它现在对两者都有效。 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
}

答案 3 :(得分:0)

您可以制作自定义UIAlertView或UIAlertViewController。这将包含您的选择器视图以及您在自定义提醒中需要的任何其他内容。

首先,创建一个新的.xib文件,并将其设置为警报的大小。 然后,放入你的图形。

现在创建一个swift文件,UIAlertView的子类,并将其命名为适当的。

  

新&gt;文件&gt; Cocoa Touch Subclass

(或类似的东西)

使.xib文件成为UIAlertView的类名。

将元素从.xib拖到新的swift文件中并正确命名。

现在使用警报视图而不是默认警报视图。

答案 4 :(得分:0)

如果您遵循代码,您可以看到UIAlertController用于显示ActionSheets和/或警报。您不应该以难的方式添加子视图,您将无法预测行为是否会受到影响。

同样在iOS 9中,不推荐使用UIPopoverController。但是在iOS 8中,UIPopoverPresentationController和它的委托在哪里引入,以帮助实现你想要的。 (阅读更多关于他们here

因此,您可以使用它来使Picker在iPad上显示为弹出窗口,但如果我没记错的话,则不会在iPhone上显示。

底线是:简单的方法是,创建一个自己的自定义视图,并让它实现popover委托协议。它应该相当简单。如果您对如何在此过程中采取行动有更多疑问,请在StackOverflow中搜索或发布新问题。