Parco giochi Swift: ottieni ViewController per call presentViewController

Mi piacerebbe giocare con UIAlertController in Playground. È ansible get ViewController da XCPlaygroundPage – per poter call presentViewController?

Solutions Collecting From Web of "Parco giochi Swift: ottieni ViewController per call presentViewController"

Sì, puoi certamente get un controller di visualizzazione, ma poiché non esiste un controller di visualizzazione "collegato", vedrai un avviso simile al seguente:

Presenting view controllers on detached view controllers is discouraged

E nel mio caso, il controller di avviso lampeggia sullo schermo super brevemente e poi scompare. Forse potresti migliorare un po 'questo?

Ad each modo, ecco come ho creato i controller di visualizzazione nel parco giochi:

 import UIKit import XCPlayground class RootViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.view.frame = CGRect(x: 0, y: 0, width: 350, height: 420) self.view.backgroundColor = UIColor.redColor() } } class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var tableView: UITableView! let items = ["Hello 1", "Hello 2", "Hello 3"] var alertController : UIAlertController? { didSet { if alertController == nil { print("alertController set to nil") } else { print("alertController set to \(alertController)") } } } override func viewDidLoad() { super.viewDidLoad() self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480) self.tableView = UITableView(frame:self.view.frame) self.tableView!.dataSource = self self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") self.view.addSubview(self.tableView) } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ return self.items.count; } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell cell.textLabel?.text = "\(self.items[indexPath.row])" return cell } override func viewDidAppear(animated: Bool) { alertController = UIAlertController.init(title: "My Title", message: "Testing in Playground", preferredStyle: .Alert) let okAction = UIAlertAction(title: "Ok", style: .Default) { (_) -> Void in // Some action here print("hit okay button") } alertController!.addAction(okAction) ctrl.presentViewController(alertController!, animated: false, completion: { print("done presenting") }) } } var ctrl = ViewController() var rootVC = RootViewController() rootVC.addChildViewController(ctrl) rootVC.view.addSubview(ctrl.view) XCPlaygroundPage.currentPage.liveView = rootVC.view 

E quello che sto facendo qui è creare un "controller di visualizzazione radice", aggiungere un controller di visualizzazione figlio con una tabella (nel tentativo di get un controller di visualizzazione "collegato" a qualcos'altro) e poi ho provato a presentare un controller di avviso su quello.

È ansible impostare liveView sulla window dopo la presentazione per evitare l'avviso.

 import UIKit import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true let window = UIWindow() let viewController = UIViewController() window.rootViewController = viewController window.makeKeyAndVisible() let alert = UIAlertController(title: "title here", message: "message here", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "action here", style: .default, handler: nil)) viewController.present(alert, animated: true, completion: nil) PlaygroundPage.current.liveView = window 

Risultato: UIAlertController sulla timeline