web-dev-qa-db-ja.com

警告:<UIAlertController:0x7facd3946920>を<...>に表示しようとしていますが、すでに表示されています(null)

セルのテキストを含むUITableViewを表示するUIAlertControllerに長押しジェスチャーを設定しています。 UIAlertControllerが表示されると、次の警告が表示されます。

Attempt to present <UIAlertController: 0x7fd57384e8e0>  on <TaskAppV2.MainTaskView: 0x7fd571701150> which is already presenting (null)

私の理解から、MainTaskView(UITableView)はすでにビューを表示しているので、2番目のビューUIAlertController.を表示するべきではありません。だから this 同様の質問からの解決策。同じ警告が表示されるため、機能しません。この警告を解決するにはどうすればよいですか?コードについては以下を参照してください:

func longPressedView(gestureRecognizer: UIGestureRecognizer){

    /*Get cell info from where user tapped*/
    if (gestureRecognizer.state == UIGestureRecognizerState.Ended) {
        var tapLocation: CGPoint = gestureRecognizer.locationInView(self.tableView)

        var tappedIndexPath: NSIndexPath? = self.tableView.indexPathForRowAtPoint(tapLocation)
        if (tappedIndexPath != nil) {
            var tappedCell: UITableViewCell? = self.tableView.cellForRowAtIndexPath(tappedIndexPath!)
            println("the cell task name is \(tappedCell!.textLabel!.text!)")
        } else {
            println("You didn't tap on a cell")
        }
    }

    /*Long press alert*/
    let tapAlert = UIAlertController(title: "Long Pressed", message: "You just long pressed the long press view", preferredStyle: UIAlertControllerStyle.Alert)
    tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
    /*
    if (self.presentedViewController == nil) {
        self.presentViewController(tapAlert, animated: true, completion: nil)
    } else {
        println("already presenting a view")
    } */

    self.presentViewController(tapAlert, animated: true, completion: nil)
    println("presented")
}

コンソール出力:

presented
You didn't tap on a cell
2015-05-19 22:46:35.692 TaskAppV2[60765:3235207] Warning: Attempt to present <UIAlertController: 0x7fc689e05d80>  on <TaskAppV2.MainTaskView: 0x7fc689fc33f0> which is already presenting (null)
presented

何らかの理由で、長押しジェスチャーが発生すると、両方のコードがifステートメントで実行されます。アラートが表示され、テキストがコンソールに出力されます。これは問題ですか?

編集:マットが言ったように、ジェスチャーレコグナイザーテストのスコープにすべてのコードがありませんでした。私の問題は修正されました。テスト外のコードが2回実行されたため、UIAlertControllerが2回表示されました。

21
MortalMan

何らかの理由で、両方のコードがifで実行されています

それは私のためにラング警報ベルを持っている必要があります。 ifelseの両方を実行することは不可能です。このコードは2回実行する必要があります。

これは、ジェスチャー認識機能の状態をテストしていないだからです。長押しg.r.アクションメッセージtwiceを送信します。あなたは長押しとリリースの両方でこのコードを実行しています。あなたはg.rの状態をテストする必要があります。そうしないでください例:

@IBAction func longPressedView(g: UIGestureRecognizer) {
    if g.state == .Began {
        // ... do it all here
    }
}
18
matt

同じ問題がありました。私はこのコードでそれを修正することができました:

        if self.presentedViewController == nil {
            self.present(Alert, animated: true, completion: nil)
        }
        else {
            self.dismiss(animated: false, completion: nil)
            self.present(Alert, animated: true, completion: nil)
        }
14

現在のコントローラーを閉じて、アラートコントローラーを次のように提示します

func alert(_ message:String) {
let alert = UIAlertController(title: "Error!", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Dismiss", style: .default, handler: nil))
self.dismiss(animated: false, completion: nil)
self.present(alert, animated: true,completion: nil)
}
0
Faiz Ul Hassan

ジェスチャーの状態を区別してから、必要なコードを実行する必要があります。そうでない場合、ターゲットに追加したセレクターは、ジェスチャーの状態がUIGestureRecognizerStateBeganのときに初めて実行され、ジェスチャーの状態がUIGestureRecognizerStateCancelledのときにもう一度実行されます。2番目のパフォーマンスは、alertControllerです。 Xcodeは警告をログに記録します。

0
Immanito