ActionSheet không hoạt động iPad


86

Tôi đang sử dụng ActionSheet trong ứng dụng của mình. Trên iPhone của tôi, nó hoạt động, nhưng nó không hoạt động trên trình mô phỏng iPad.

đây là mã của tôi:

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

Và lỗi của tôi:

Chấm dứt ứng dụng do không có ngoại lệ 'NSGenericException', lý do: 'Ứng dụng của bạn đã trình bày một UIAlertController () kiểu UIAlertControllerStyleActionSheet. ModalPresentationStyle của một UIAlertController với kiểu này là UIModalPresentationPopover. Bạn phải cung cấp thông tin vị trí cho cửa sổ bật lên này thông qua popoverPresentationController của bộ điều khiển cảnh báo. Bạn phải cung cấp một sourceView và sourceRect hoặc một barButtonItem. Nếu thông tin này không được biết khi bạn xuất trình bộ điều khiển cảnh báo, bạn có thể cung cấp thông tin đó trong phương thức UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation. '


Liên kết này có thể giúp bạn.
Nimisha Patel

4
ios 8 trở lên không có hành động dụ tấm UIActionController u cần phải thiết lập kiểu như UIAlertControllerStyleActionSheet .... điều này có thể giúp bạn .... dù uipopover là gợi ý cho iPad ....
Arun

Bạn phải trình bày nó dưới dạng cửa sổ bật lên trên iPad
Totka

Câu trả lời:


110

Bạn cần cung cấp chế độ xem nguồn hoặc nút ngay trước khi trình bày optionMenu vì trên iPad, nó là UIPopoverPresentationController, Như nó nói trong lỗi của bạn. Điều này chỉ có nghĩa là trang hành động của bạn trỏ đến nút cho người dùng biết nó bắt đầu từ đâu.

Ví dụ: nếu bạn đang trình bày optionMenu của mình bằng cách nhấn vào mục thanh điều hướng bên phải. Bạn có thể làm điều gì đó như sau:

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

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

hoặc bạn có thể đặt chế độ xem như sau: (Bạn chỉ cần một trong 2 cái này)

optionMenu.popoverPresentationController?.sourceView = yourView

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

Cũng nên nhớ rằng nếu bạn thay đổi UIAlertControllerStyle thành Cảnh báo thay vì trang hành động, Bạn sẽ không cần chỉ định điều này. Tôi chắc rằng bạn chắc hẳn đã tìm ra nhưng tôi chỉ muốn giúp bất cứ ai xem qua trang này.


30

Cùng một vấn đề đối với tôi. Tôi đã có một UIAlertController hoạt động tốt trên điện thoại nhưng bị lỗi trên iPad. Trang tính bật lên khi một ô được nhấn từ chế độ xem bảng.

Đối với Swift 3, tôi đã thêm 3 dòng mã ngay trước khi trình bày:

        ...

        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
Điều này đã hiệu quả với tôi trong Swift 5.0 nhưng tôi không biết cách hiển thị cửa sổ bật lên từ dưới cùng của chế độ xem. Cảm ơn bạn!
Florentin Lupascu

@FlorentinLupascu: Chỉ cần thiết lập permittedArrowDirections để UIPopoverArrowDirection.Down và sourceRect = CGRect (x: self.view.bounds.midX, y: self.view.bounds.bottom, width: 0, height: 0)
quá

24

Swift 3

Như đã nói trước đây, bạn nên cấu hình UIAlertController để được trình bày ở một điểm cụ thể trên iPAD.

Ví dụ cho thanh điều hướng:

    // 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

Nếu bạn muốn trình bày nó ở trung tâm mà không có mũi tên [ 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

thêm các tuyên bố trong các điều khoản sau đây trước khi trình bày.

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

nó sẽ hoạt động tốt.


Hoạt động hoàn hảo. Điều duy nhất là bạn cần thêm Mục thanh điều hướng bên trái, vì vậy menu bật lên trông giống như nó xuất hiện từ hư không
Eugene Pavlov

0

Chỉ cần lưu ý rằng bạn cũng có thể gặp lỗi này nếu bạn chưa liên kết nguồn xem trong IB với biến có liên quan trong ứng dụng của mình.


0

bạn cần thêm cái này cho Ipad

alertControler.popoverPresentationController?.sourceView = self.view


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.