想要在 UIAlertController 或 UIPopoverController Swift 中显示 UIPickerView?

Posted

技术标签:

【中文标题】想要在 UIAlertController 或 UIPopoverController Swift 中显示 UIPickerView?【英文标题】:want to show UIPickerView in UIAlertController or UIPopoverController Swift? 【发布时间】:2015-10-20 10:13:19 【问题描述】:

我想在 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/

【问题讨论】:

请查看:***.com/questions/25545982/… 在上面的例子中,“配置文件”给出了错误。不适合我。 我的朋友,“个人资料”,“用户”是另一个来源的字段。您必须设置它的适当字段或删除它们。 会建议使用 UIActionSheet 来显示 uipickerview。这将是最简单的。 UIActionSheet 已弃用...这就是为什么我要使用 uipickerview。 【参考方案1】:

您的基本代码如下所示:

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?

【讨论】:

我正在尝试解决它。谢谢你的回答。如果它对我有用,我会将其标记为正确答案。 @IbadUrRahman,好的,NP。如果您需要任何帮助,请随时与我联系。编码快乐! 我将选择器视图添加到警报中,但选择器视图未显示在警报中。选择器视图创建将在没有警报但不使用警报视图的情况下工作。 你不应该这样做,你正在硬添加一个子视图。您还使用幻数来定义选择器的框架。真正考虑制作自己的自定义视图。是最佳实践。或者在 GitHub 上查找第三方库。【参考方案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)

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

【讨论】:

【参考方案3】:

以下代码用于显示 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

【讨论】:

【参考方案4】:

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

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

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

新建 > 文件 > Cocoa Touch 子类

(或类似的东西)

让你的 .xib 文件成为你的 UIAlertView 的类名。

将您的元素从 .xib 拖到您的新 swift 文件中并适当地命名它们。

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

【讨论】:

【参考方案5】:

如果您按照代码进行操作,您会看到 UIAlertController 用于显示 ActionSheets 和/或 Alerts。你不应该为它们添加子视图,你将无法预测行为是否会受到影响。

从 iOS 9 开始,UIPopoverController 也被弃用了。但在 iOS 8 中,UIPopoverPresentationController 和它的委托被引入以帮助实现你想要的。 (阅读更多关于他们的信息here)

所以你可以用它来让你的 Picker 在 iPad 上显示为弹出框,但如果我没记错的话,在 iPhone 上就不行。

底线是:简单的方法是,制作一个您自己的自定义视图并让它实现弹出框委托协议。它应该相当简单。如果您对如何做某事有更多疑问,请在 *** 中搜索此处或发布新问题。

【讨论】:

以上是关于想要在 UIAlertController 或 UIPopoverController Swift 中显示 UIPickerView?的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertController简单使用

UIAlertController中的多行可编辑文本UITextview?

iOS 10:UIAlertController 只显示一个动作

SwiftUI:UIAlertController ActionSheet 全屏

我有错误:“UIAlertController”没有可见界面

UiAlertView 或 UiAlertController 在 Swift 中仅显示一次