it-swarm.com.de

Warnung: UIAlertController präsentiert bereits

Ich bin ein Neuling in Swift und XCode, bitte verzeihen Sie mir den wahrscheinlich wirklich chaotischen Code! Beim Ausführen meines Codes erhalte ich die folgende Warnung: Warnung: Versuch zu präsentieren, auf dem bereits präsentiert wird 

Ich habe das Forum bereits überprüft und einen Beitrag zu diesem Thema gefunden ... Ich habe die vorgeschlagene Hilfe in folgender Form angewendet:

if presentedViewController !== nil {
     self.presentViewController(alertController, animated: true, completion: nil)
} else{
     self.dismissViewControllerAnimated(false, completion: nil)
     self.presentViewController(alertController, animated: true, completion: nil)
}

Trotzdem gibt es immer noch die gleiche Warnung ... Ich glaube, ich muss da etwas falsch gemacht haben. Es wäre toll, wenn mir bitte jemand helfen könnte :) Auch wenn da irgendein Vorschlag ist, wie ich meinen Code "bereinigen" kann, sind wir sehr dankbar :)

import UIKit

class ViewController: UIViewController {

@IBOutlet var Label: UILabel!

@IBOutlet var ukFlag: UITextView!

@IBOutlet var movie: UITextView!

@IBOutlet var piano: UITextView!

@IBOutlet var book: UITextView!

@IBOutlet var dance: UITextView!

@IBOutlet var Paint: UITextView!

@IBOutlet var row: UITextView!

@IBOutlet var envelope: UITextView!

@IBOutlet var dragon: UITextView!

@IBOutlet var instagram: UITextView!


func londonPuzzle(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
      self.ifCollided()


}


func misleadOne(sender: UIPanGestureRecognizer) {

    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}

func bestival(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
      self.ifCollided()

    }

func rosieProject(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}

func misleadTwo(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}

func misleadThree(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}

func misleadFour(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}
func voucher(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}

func welsh(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}

func hulk(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPointZero, inView: self.view)
    self.ifCollided()

}

func ShowAlertWrong(){

    let alertController = UIAlertController(title: "Sorry", message:   " Guess again!", preferredStyle: .Alert)

    let okAction = UIAlertAction( title: "Ok", style:   UIAlertActionStyle.Default) {
        UIAlertAction in

        self.ukFlag.center = CGPointMake(150, 225)
        self.movie.center = CGPointMake(150, 225)
        self.piano.center = CGPointMake(150, 225)
        self.dance.center = CGPointMake(150, 225)
        self.Paint.center = CGPointMake(150, 225)
        self.row.center = CGPointMake(150, 225)
        self.envelope.center = CGPointMake(150, 225)
        self.dragon.center = CGPointMake(150, 225)
        self.instagram.center = CGPointMake(150, 225)
    }

    let resetAction = UIAlertAction( title: "Reset", style: UIAlertActionStyle.Default) {
        UIALertAction in

        self.ukFlag.center = CGPointMake(150, 225)
        self.movie.center = CGPointMake(150, 225)
        self.piano.center = CGPointMake(150, 225)
        self.dance.center = CGPointMake(150, 225)
        self.Paint.center = CGPointMake(150, 225)
        self.row.center = CGPointMake(150, 225)
        self.envelope.center = CGPointMake(150, 225)
        self.dragon.center = CGPointMake(150, 225)
        self.instagram.center = CGPointMake(150, 225)

    }

    alertController.addAction(okAction)
    alertController.addAction(resetAction)
    self.presentViewController(alertController, animated: true, completion: nil)

}




func ShowAlertWin(){



    let alertController = UIAlertController(title: "Congrats????", message: " You are correct!????????", preferredStyle: .Alert)

    let okAction = UIAlertAction( title: "Ok", style: UIAlertActionStyle.Default) {
        UIAlertAction in

        self.book.center = CGPointMake(150, 150)


    }

  /*  let resetAction = UIAlertAction( title: "Reset and hope the mood has changed", style: UIAlertActionStyle.Default) {
        UIALertAction in

        self.Angry.center = CGPointMake(150, 150)
    }*/

    alertController.addAction(okAction)
   // alertController.addAction(resetAction)
    if presentedViewController !== nil {
        self.presentViewController(alertController, animated: true, completion: nil)

    } else{
        self.dismissViewControllerAnimated(false, completion: nil)
        self.presentViewController(alertController, animated: true, completion: nil)
    }



}






@IBAction func ifCollided(){

if CGRectIntersectsRect(Label.frame, ukFlag.frame) {
    ShowAlertWrong()
}
    else if CGRectIntersectsRect(Label.frame, movie.frame){
           ShowAlertWrong()
        } else if CGRectIntersectsRect(Label.frame, piano.frame){
                ShowAlertWrong()
        }  else if CGRectIntersectsRect(Label.frame, dance.frame){
            ShowAlertWrong()
} else if CGRectIntersectsRect(Label.frame, Paint.frame){
    ShowAlertWrong()
} else if CGRectIntersectsRect(Label.frame, row.frame){
    ShowAlertWrong()
} else if CGRectIntersectsRect(Label.frame, envelope.frame){
    ShowAlertWrong()
} else if CGRectIntersectsRect(Label.frame, dragon.frame){
    ShowAlertWrong()
} else if CGRectIntersectsRect(Label.frame, instagram.frame){
    ShowAlertWrong()
} else if CGRectIntersectsRect(Label.frame, book.frame){
    ShowAlertWin()
}


}




override func viewDidLoad() {
    super.viewDidLoad()
    ukFlag.addGestureRecognizer(UIPanGestureRecognizer(target: self,      action: #selector(self.londonPuzzle(_:))))
    movie.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadOne(_:))))
    piano.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.bestival(_:))))
    book.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.rosieProject(_:))))
    dance.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadTwo(_:))))
    Paint.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadThree(_:))))
    row.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.misleadFour(_:))))
    envelope.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.voucher(_:))))
    dragon.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.welsh(_:))))
    instagram.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.hulk(_:))))


}

}
7
CatiaV5

Sie müssen Ihren Code so ändern, dass der zweite alertController nach Beendigung der Entlassung angezeigt wird. Ändern Sie auch Ihre if-Bedingung mit meiner.

if presentedViewController == nil {
     self.presentViewController(alertController, animated: true, completion: nil)
} else{
      self.dismissViewControllerAnimated(false) { () -> Void in
           self.presentViewController(alertController, animated: true, completion: nil)
      }
}

Hoffe, das wird dir helfen.

20
Nirav D

Versuche dies

if let presented = self.presentedViewController {
     presented.removeFromParentViewController()
  }

if presentedViewController == nil {
     self.present(alert, animated: true, completion: nil)
  }
2
Vimal Saifudin

So debugge ich diesen Fehler in Swift 4.2:

     let alert = UIAlertController(title: "Oops!", message: "No Internet Connection", preferredStyle: .alert)
        let alertAction = UIAlertAction(title: "OK", style: .default)
        alert.addAction(alertAction)
        if let presented = self.presentedViewController {
            presented.removeFromParent()
        }

        if presentedViewController == nil {
            self.present(alert, animated: true, completion: nil)
        }       
      }

Ich weiß die Ablehnung von Alerts zu schätzen, wie in allen Antworten erwähnt. Aber ich persönlich würde niemals lieber etwas ablehnen, das ich gar nicht erst heraufbeschwören wollte. Wenn wir also nur nachsehen könnten, warum mehrere Warnungen überhaupt erst generiert werden, wäre das fantastisch. 

Die Verwendung von UIGestureRecogniser zum Generieren von UIAlert ist schwierig. Gesten senden Nachrichten in allen zugrunde liegenden Zuständen. Zum Beispiel: wenn unten mein Code ist: 

// Attaching LongPress to a button
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(deleteSelectedProfile(_:)))

// Method to generate appropriate alert
@objc func deleteSelectedProfile(_ sender: UILongPressGestureRecognizer) {
    let alert = UIAlertController(title: "Delete Profile", message: "Word!" , preferredStyle: .alert)
    let deleteAction = UIAlertAction(title: "Delete", style: .destructive) { (action) in
        // Code
    }
    alert.addAction(deleteAction)    
    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
    alert.addAction(cancelAction)
    present(alert, animated: true, completion: nil)
}

UIAlert wird für verschiedene Zustände der Geste aufgerufen, beginnend mit .began, bis .ended. Wenn also sauberer Code erforderlich ist, würde ich niemals eine der Alerts deaktivieren, die in den einzelnen Zuständen der Geste erstellt wurden, sondern nur einen UIAlert generieren. Das heißt, ich würde einfach den Staat als meinen Zustand verwenden. 

Daher werde ich Folgendes ändern:

@objc func deleteSelectedProfile(_ sender: UILongPressGestureRecognizer) {
    if sender.state == .began {
        let alert = UIAlertController(title: "Delete Profile", message: "Word!" , preferredStyle: .alert)
        let deleteAction = ...
        alert.addAction(deleteAction)    
        let cancelAction = ...
        alert.addAction(cancelAction)
        present(alert, animated: true, completion: nil)
    }
}

Auf diese Weise werde ich nur eine Warnung und eine Warnung generieren, wenn dies erforderlich ist.

0
Manganese

Sie können einen anderen UIAlertController oder etwas anderes präsentieren, das Sie aus dem aktuellen UIAlertController wünschen. Erstellen Sie eine Helper-Funktion, um den oben sichtbaren Viewcontroller zu erhalten, und rufen Sie dazu einen aktuellen Anruf auf

func topVisibleViewController(viewController: UIViewController) -> UIViewController? {
    let viewController = viewController ?? UIApplication.shared.keyWindow?.rootViewController

    if let navigationController = viewController as? UINavigationController, !navigationController.viewControllers.isEmpty {
        return visibleViewController(navigationController.viewControllers.last)
    }
    else if let tabBarController = viewController as? UITabBarController,
        let selectedController = tabBarController.selectedViewController {
        return visibleViewController(selectedController)
    }
    else if let presentedController = viewController?.presentedViewController {
        return visibleViewController(presentedController)
    }

    return viewController
}
0
Long.h.nguyen

Versuche dies:

   [self dismissViewControllerAnimated:YES completion:nil];
    UIAlertController *alertResync = [UIAlertController alertControllerWithTitle:@"Warning"
                                                                         message:@"Warning Warning"
                                                                  preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *softResyncButton = [UIAlertAction actionWithTitle:@"No, keep Some"
                                                               style:UIAlertActionStyleDefault
                                                             handler:^(UIAlertAction * _Nonnull action) {

                                                             }];

        UIAlertAction *hardResyncButton = [UIAlertAction actionWithTitle:@"Yes"
                                                                   style:UIAlertActionStyleDestructive
                                                                 handler:^(UIAlertAction * _Nonnull action) {
                                                                     [self testFunc];
                                                                 }];
        [alertResync addAction:softResyncButton];
        [alertResync addAction:hardResyncButton];
        [self presentViewController:alertResync animated:YES completion:nil];
0
Zouhair Sassi