2016-10-11 13 views
0

私はビュー内にUIButtonを持っています。 UIButtonはiPadでUIAlertControllerとdisplayShareSheetがクラッシュする

enter image description here

ように配置されている私はUIButtonは、これは

enter image description here

のように見えるのアラートを生成

@IBAction func shareButtonClicked(_ sender: AnyObject) { 
    Flurry.logEvent("Share button tapped"); 


    let textToShare = quotetext.text 

    // 1. 
    // Create and initialize a UIAlertController instance. 
    // 
    let alertController = UIAlertController(title: nil, 
              message: nil, 
              preferredStyle: .actionSheet) 

    // 2. 
    // Initialize the actions to show along with the alert. 
    // 
    let copyAction = UIAlertAction(title:"Copy Quote to clipboard", 
            style: .default) { (action) -> Void in 
            let pasteboard: UIPasteboard = UIPasteboard.general 
            pasteboard.string = self.quotetext.text; 
    } 

    let defaultAction = UIAlertAction(title:"Share Quote", 
             style: .default) { (action) -> Void in 
             // We have contents so display the share sheet 
             self.displayShareSheet(shareContent: textToShare) 

    } 

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (action) in 
     // ... 
    } 

    // 3. 
    // Tell the alertController about the actions we want it 
    // to present. 
    // 
    alertController.addAction(copyAction) 
    alertController.addAction(defaultAction) 
    alertController.addAction(cancelAction) 


    // 4. 
    // Present the alert controller and associated actions. 
    // 
    self.present(alertController, animated: true, completion: nil) 

} 

クリックされたときにトリガーされる@IBActionを持っています[共有引用]を選択すると、アラートによってshareSheetが表示されます。

この@IBActionはiPhoneで動作しますが、iPadではクラッシュしています。エラーメッセージが

'NSGenericException'、理由である:「あなたのアプリケーションは、スタイル UIAlertControllerStyleActionSheetの UIAlertController()を提示しました。このスタイルの UIAlertControllerのmodalPresentationStyleはUIModalPresentationPopoverです。 は、このポップオーバーの位置情報を、コントローラのpopoverPresentationController アラートによって提供する必要があります。 sourceViewとsourceRectまたはbarButtonItemのいずれかを指定する必要があります。 アラートコントローラを表示するときにこの情報が である場合は、 UIPopoverPresentationControllerDelegateメソッド -prepareForPopoverPresentationに入力してください。

私は、この修正プログラムは動作しません

//iPad 

    alertController.popoverPresentationController?.sourceView = viewBottom 
    alertController.popoverPresentationController?.sourceRect = viewBottom.bounds 
    alertController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.down; 

ような何かを試みることによってこの問題を解決しようとしてきました。アラートは 'viewBottom'上に正しく配置されず、 'defaultAction'ボタンをクリックすると、上記のエラーメッセージで再びクラッシュします。

私はこの問題を解決するためにここに迷っています。誰もこれについていくつかのアドバイスを与えることができますか?私はUIPopoverPresentationControllerDelegate方法 -prepareForPopoverPresentation

を使用するためのさまざまな方法を試してみました。」

私のコードでは、成功しませんでした。これについて何かアドバイスをいただきました。ありがとう。

答えて

0

これらの行に置き換え:あなたはまた、プロパティの設定あなたのdisplayShareSheet方法で共有シートのpopoverPresentationController必要

if let button = sender as? UIButton { 
    alertController.popoverPresentationController?.sourceView = button 
    alertController.popoverPresentationController?.sourceRect = button.bounds 
} 

:で

alertController.popoverPresentationController?.sourceView = viewBottom 
alertController.popoverPresentationController?.sourceRect = viewBottom.bounds 
alertController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.down; 

を。おそらく、そのメソッドのパラメータとしてUIButtonを渡して、そこで使用する必要があります。

+0

私のボタンがUIButtonであり、UIBarButtonItemではないことを考慮しても問題は解決しますか?私はそれのためのコンセントを既に持っています - @IBOutlet弱いvarのuploadBtn:UIButton! – user619804

+0

私はそれが 'UIBarButtonItem'だと仮定しました。 'UIButton'の私の更新を見てください。 – rmaddy

+0

alertControllerにはうってつけ!正しく配置されています。 「ディスプレイの共有シート」はまだクラッシュしています。同じように共有シートをどのように設定できるのか分かりません。 – user619804

関連する問題