ActionSheet iPad'de çalışmıyor


86

Uygulamamda ActionSheet kullanıyorum. İPhone'umda çalışıyor, ancak iPad simülatöründe çalışmıyor.

bu benim kodum:

@IBAction func dialog(sender: AnyObject) {

    let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet)
    let deleteAction = UIAlertAction(title: "Delete", style: .Default, handler: {

        (alert: UIAlertAction!) -> Void in
        println("Filtre Deleted")
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        println("Cancelled")
    })

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(cancelAction)

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

Ve benim hatam:

Uygulamanın yakalanmamış istisna 'NSGenericException' nedeniyle sonlandırılması, nedeni: 'Uygulamanız UIAlertControllerStyleActionSheet tarzında bir UIAlertController () sundu. Bu stile sahip bir UIAlertController modalPresentationStyle, UIModalPresentationPopover'dır. Uyarı denetleyicisinin popoverPresentationController aracılığıyla bu açılır pencere için konum bilgisi sağlamanız gerekir. Bir sourceView ve sourceRect veya bir barButtonItem sağlamanız gerekir. Uyarı denetleyicisini sunduğunuzda bu bilgi bilinmiyorsa, UIPopoverPresentationControllerDelegate yönteminde -prepareForPopoverPresentation sağlayabilirsiniz. '


Bu Bağlantı size yardımcı olabilir.
Nimisha Patel

4
ios 8 ve üzeri hiçbir eylem sayfası yoktur UIActionController örneği u türü UIAlertControllerStyleActionSheet olarak ayarlamanız gerekir .... bu size yardımcı olabilir .... ancak uipopover iPad için önerilir ....
Arun

Onu iPad'de açılır pencere olarak göstermelisiniz
Totka

Yanıtlar:


110

OptionMenu'yu sunmadan hemen önce bir kaynak görünümü veya düğme sağlamanız gerekir, çünkü iPad'de bir UIPopoverPresentationController, hatanızda dediği gibi. Bu sadece, işlem sayfanızın, kullanıcının nereden başladığını bilmesini sağlayan düğmeye işaret ettiği anlamına gelir.

Örneğin sağ gezinme çubuğu öğesine dokunarak Seçenek Menünüzü sunuyorsanız. Bunun gibi bir şey yapabilirsiniz:

optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

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

veya şöyle bir görünüm ayarlayabilirsiniz: (Sadece bu ikisinden birine ihtiyacınız var)

optionMenu.popoverPresentationController?.sourceView = yourView

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

Ayrıca, UIAlertControllerStyle'ınızı eylem sayfası yerine Uyarı olarak değiştirirseniz, bunu belirtmeniz gerekmeyeceğini unutmayın. Eminim çözmüşsündür ama ben sadece bu sayfaya rastlayan herkese yardım etmek istedim.


31

Benim için de aynı sorun. Telefonda iyi çalışan, ancak iPad'e düşen bir UIAlertController'ım vardı. Tablo görünümünden bir hücreye dokunulduğunda sayfa açılır.

Swift 3 için, sunmadan hemen önce 3 satır kod ekledim:

        ...

        sheet.popoverPresentationController?.sourceView = self.view
        sheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection()
        sheet.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)


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

1
Bu benim için Swift 5.0'da çalıştı ancak açılır pencereyi görünümün altından nasıl göstereceğimi bilmiyorum. Teşekkür ederim!
Florentin Lupascu

@FlorentinLupascu: permittedArrowDirections'ı UIPopoverArrowDirection.Down ve sourceRect = CGRect (x: self.view.bounds.midX, y: self.view.bounds.bottom, width: 0, height: 0)
ayrıca

24

Hızlı 3

Daha önce de belirtildiği gibi, UIAlertController'ı iPAD üzerinde belirli bir noktada sunulacak şekilde yapılandırmalısınız.

Gezinme çubuğu örneği:

    // 1
    let optionMenu = UIAlertController(title: nil, message: "Choose an option", preferredStyle: .actionSheet)

    // 2
    let deleteAction = UIAlertAction(title: "Option 1", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 1 pressed")
    })
    let saveAction = UIAlertAction(title: "Option 2", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 2 pressed")
    })

    //
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        print("Cancelled")
    })


    // 4

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(saveAction)
    optionMenu.addAction(cancelAction)

    // 5

    optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

    self.present(optionMenu, animated: true) { 
        print("option menu presented")
    }

8

Ortada oklar olmadan sunmak isterseniz [ Swift 3+ ]:

if let popoverController = optionMenu.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []
    }
self.present(optionMenu, animated: true, completion: nil)

5

Sunulmadan önce aşağıdaki terimlerdeki ifadeleri ekleyin.

optionMenu.popoverPresentationController.sourceView = self.view;
optionMenu.popoverPresentationController.sourceRect = 

CGRectMake(0,0,1.0,1.0);


@IBAction func dialog(sender: AnyObject) {
    ...

    optionMenu.popoverPresentationController.sourceView = self.view;
    optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0);

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

iyi çalışacak.


Mükemmel çalıştı. Tek şey, Sol Gezinme çubuğu Öğesi eklemeniz gerektiğidir, böylece açılır menü hiçbir yerden çıkmıyor gibi görünmez
Eugene Pavlov

0

IB'deki kaynak görüntülemeyi uygulamanızdaki ilgili değişkene bağlamadıysanız da bu hatayı alabileceğinizi unutmayın.


0

bunu Ipad için eklemeniz gerekiyor

alertControler.popoverPresentationController?.sourceView = self.view


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.