web-dev-qa-db-ja.com

UIAlertControllerまたはUIPopoverControllerSwiftでUIPickerViewを表示したいですか?

UIAlertControllerまたはUIPopoverControllerでUIPickerViewを表示したいのですが、iOSを初めて使用するので、ここにサンプルコードをいくつか示してください。

それらを検索しましたが、満足のいく答えが見つかりませんでした。 iOS 9で非推奨になっているため、UIActionSheetでは実行しません。また、Swift Obj-Cではありません。以下の例を試しましたが、機能しません。私のために。

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

8
ibad ur rahman

以下のコードは、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
}
2
ibad ur rahman

基本コードは次のようになります。

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.

以下の回答を確認してください。

SwiftのUIAlertController(アラートまたはActionSheet)にUIPickerViewを追加する方法はありますか?

10

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

他のすべての答えは良いです、なぜそれがあなたのために働かないのか分かりません。コードを追加してください。

2
truongky

カスタムUIAlertViewまたはUIAlertViewControllerを作成できます。これには、ピッカービューとカスタムアラートに必要なその他のものが含まれます。

まず、新しい.xibファイルを作成し、それをアラートのサイズにします。次に、グラフィックを入力します。

次に、UIAlertViewのサブクラスであるSwiftファイルを作成し、適切な名前を付けます。

新規>ファイル> CocoaTouchサブクラス

(またはそのようなもの)

.xibファイルをUIAlertViewのクラス名にします。

要素を.xibから新しいSwiftファイルにドラッグし、適切な名前を付けます。

デフォルトのアラートビューの代わりにアラートビューを使用するようになりました。

0
brimstone

コードに従うと、UIAlertControllerがActionSheetsやアラートの表示に使用されていることがわかります。サブビューを難しい方法で追加しないでください。動作が影響を受けるかどうかを予測することはできません。

また、iOS 9以降、UIPopoverControllerは非推奨になりました。しかし、iOS 8では、UIPopoverPresentationControllerとそのデリゲートが導入され、目的を達成するのに役立ちます。 (それらについてもっと読む ここ

したがって、これを使用して、PickerがiPadでポップオーバーとして表示されるようにすることができますが、私が正しく覚えていれば、iPhoneでは表示されません。

結論は次のとおりです。簡単な方法は、独自のカスタムビューを作成し、ポップオーバーデリゲートプロトコルを実装することです。それはかなり簡単なはずです。途中で何かを行う方法についてさらに疑問がある場合は、ここStackOverflowで検索するか、新しい質問を投稿してください。

0
MikePT28