我想在Playground玩UIAlertController。是否可以从XCPlaygroundPage获取ViewController - 能够调用presentViewController?
答案 0 :(得分:5)
您可以在演示后将liveView设置为您的Window ,以避免出现警告。
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
答案 1 :(得分:2)
是的,您当然可以获得一个视图控制器,但由于没有“附加”视图控制器,您最终会看到如下警告:
Presenting view controllers on detached view controllers is discouraged
在我的情况下,警报控制器在屏幕上超短暂闪烁,然后消失。也许你可以稍微改进一下吗?
无论如何,这是我在操场上创建视图控制器的方法:
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
我在这里做的是创建一个“根视图控制器”,添加一个带有表的子视图控制器(试图让一些视图控制器“附加”到其他东西)然后我试图呈现一个警报控制器。