2017-05-16 3 views
3

Ich möchte ein UIAlert als "Check" für einen Benutzer einrichten. Der Benutzer wird eine Reihe von Informationen speichern, aber ich möchte dem Benutzer eine Chance geben, die Informationen nach dem Klicken auf die Schaltfläche "Speichern" zu überprüfen. Im Wesentlichen, schlagen sie zu „retten“, und dann will ich einen UIAlert die Informationen angezeigt werden zeigen, sie zu fragen sparen „Sind all diese Informationen, die Sie sicher, korrekt ist:“ und dann alle Infos angezeigt:Wie richtet man UIAlert ein, um viele Informationen anzuzeigen?

@IBAction func saveButtonTapped(_ sender: UIBarButtonItem) { 
     //create alert (I know how to do this) that shows all info (I don't know how to do this) 
     //If user is ok with the info, perform a segue, if not return to page 
} 

Das Problem ist, dass ich weiß, UIAlerts kann Komponenten wie "Titel" und "Nachricht" haben, aber ich möchte die Warnung eine Vielzahl von Informationen in einer Liste wie Mode anzeigen. Gibt es das überhaupt, um das zu tun? Oder muss ich keine Warnung verwenden und sie stattdessen auf eine andere Bestätigungsseite oder ein anderes UI-Element bringen?

Antwort

2

Um einen Alarm auf einem View-Controller anzuzeigen, kann der folgende Code verwendet werden.

let a = UIAlertController(title: "Your title", message: "Your message", preferredStyle: .alert) 
a.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in 
    // Pressed "OK" 
})) 
self.present(a, animated: true, completion: { finished in 
    // Alert shown 
}) 

Es gibt jedoch eine Grenze dafür, wie viele Informationen in eine Warnung passen. Wenn Sie etwas länger haben, könnte das Erstellen eines neuen View-Controllers und das modale Präsentieren auch funktionieren. Dadurch können Sie anpassen, wie Informationen angezeigt werden sollen (z. B. mit einer Bildlauf-/Seitenansicht). Sie können Ihren View-Controller auch so anpassen, dass er wie eine Warnung aussieht, sodass der Zweck klarer ist. Um einen View Controller modal darzustellen, können Sie die Methode present verwenden.

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

Eine Methode, ich habe in dem Pfad verwendet eine Warnung ähnliche Controller modale Ansicht zu machen sind ein kleineren View-Controller über die aktuelle Präsentation und das Ändern es ist modal Präsentationsstil, so dass Sie den Basis-View-Controller sehen durch.

let otherVC = self.storyboard?.instantiateViewController(withIdentifier: "OtherViewController") as! OtherViewController 
otherVC.modalPresentationStyle = .overCurrentContext 
otherVC.view.center = vc.view.center 
otherVC.delegate = self //Create a delegate so that you can control actions such as "OK" buttons 
self.view.isUserInteractionEnabled = false //Stop the user interacting with the view controller behind the alert 
self.present(otherVC, animated: true, completion: nil) 

Edit: Sie können die Delegierten Steueraktionen machen, wie die Warnung mit Aktionen zu schließen. Zum Beispiel könnte dies ein Beispiel für Ihre Stellvertretung sein:

protocol AlertDelegate { 
    func didCancel() 
    func didOkay() 
} 

Dann könnten Sie diese implementieren etwa so:

class RootViewController: UIViewController, AlertDelegate { 
    func didCancel() { ... } 
    func didOkay() { ... } 

    func showAlert() { 
     ... 
     otherVC.delegate = self 
     ... 
    } 
} 

Dann in Ihrem Alert-View-Controller, Sie mit den Delegierten in Wechselwirkung treten können.

class MyAlert: UIViewController { 
    var delegate: AlertDelegate! 

    @IBAction func cancelButton(sender: UIButton) { 
     delegate.didCancel() 
     self.dismiss(animated: true, completion: nil) 
    } 
} 

Also, wenn die Löschtaste auf dem Alarm-View-Controller angeklickt wird, würden die Delegierten sagen, dass es aufgehoben und der modal-View-Controller würde entlassen werden. Dann würde der Root-View-Controller diese Aktion erhalten und könnte entsprechend damit umgehen.

+0

Ich mag diese Idee. Wie schließe ich schließlich den overtop viewController (otherVC)? Und, mit dieser Einrichtung, kann ich Code von der ursprünglichen VC ausführen, sagen wir, nachdem der Benutzer "Ok" in anderenVC und andereVC schließt? ... Ich möchte die saveButton auf der OriginalVC, um die andereVC mit der Info zu öffnen ... der Benutzer schlägt "Ok" in anderenVC, der andereVC schließt/verschwindet, und dann möchte ich den Rest des 'saveButtonTapped' Codes von der ursprünglichen VC laufen lassen? –

+0

@AlekPiasecki Ja, der Delegierte ist hier sehr praktisch. Siehe die Bearbeitung, die ich für weitere Informationen vorgenommen habe. – brimstone

+0

Ich habe noch eine Frage. Sie haben '' self.view.isUserInteractionEnabled = false '' im RootViewController aufgerufen, als die Schaltfläche getroffen wurde. Offensichtlich muss ich 'self.view.isUserInteractionEnabled = true' in der anderen VC setzen, sobald eine der Schaltflächen ausgeführt wurde (" ok "oder" cancel "), aber wie verweise ich auf diesen RootViewController im Code des anderen VCs? Ich habe versucht: 'rootVC = self.storyboard? .instantiateViewController (withIdentifier:" RootViewController ") als! RootViewController "und dann, in der" ok "-Schaltfläche in der anderen VC,' rootVC.view.isUserInteractionEnabled = true', aber dies hat nicht funktioniert. –

1

Sie können verwenden Sie die UIAlertViewController, um viele Zeilen zu präsentieren, und es wird Scroll automatisch behandeln. Aber die Frage ist, ob es brauchbar und schön genug ist?

Werfen Sie einen Blick auf dieses einfache Beispiel:

@IBAction func showAlert(_ sender: UIButton) {   
     var lines = [String]() 
     for i in 1...100 { 
      lines.append("this is line \(i)") 
     } 

     let alertController = UIAlertController(title: "title", message: lines.joined(separator: "\n"), preferredStyle: .alert) 

     alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 

     present(alertController, animated: true, completion: nil) 
    } 

Was mich diese Ansicht gibt:

alert view with many lines

mit rollbaren Inhalt.

Einige Probleme und Überlegungen:

  1. Es scheint eine Obergrenze zu sein. Wenn ich dies zu for i in 1...500 zum Beispiel ändern sehe ich keine Inhalte
  2. Dies ist nicht wirklich benutzerfreundlich Ich denke

Also ... ich denke, Sie eine andere Lösung in Betracht ziehen sollten als UIAlertViewController :)

Hoffe das hilft dir.

+0

Es gibt eine iOS-Designrichtlinie, die empfiehlt, dass Sie nicht so viele Informationen hinzufügen, dass ein 'UIAlertViewController' auch scrollen muss. –

+0

@DanielStorm ah ... danke, das macht Sinn. Der Content-Typ verstopft den 'UIAlertViewController' nicht – pbodsk

Verwandte Themen