Swift Playground:让 ViewController 调用 presentViewController

Posted

技术标签:

【中文标题】Swift Playground:让 ViewController 调用 presentViewController【英文标题】:Swift playground: get ViewController to call presentViewController 【发布时间】:2016-01-09 12:09:10 【问题描述】:

我想在 Playground 中使用 UIAlertController。是否可以从 XCPlaygroundPage 获取 ViewController - 以便能够调用 presentViewController?

【问题讨论】:

【参考方案1】:

您可以将 liveView 设置为您的窗口在展示之后,以避免出现警告。

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

结果:

【讨论】:

【参考方案2】:

是的,您当然可以获得视图控制器,但由于没有“附加”视图控制器,您最终会看到如下所示的警告:

Presenting view controllers on detached view controllers is discouraged

在我的情况下,警报控制器在屏幕上超级短暂地闪烁然后消失了。或许您可以对此有所改进?

无论如何,这是我在 Playground 中创建视图控制器的方式:

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

我在这里做的是创建一个“根视图控制器”,添加一个带有表的子视图控制器(试图将一些视图控制器“附加”到其他东西上),然后我尝试展示一个警报控制器。

【讨论】:

以上是关于Swift Playground:让 ViewController 调用 presentViewController的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 Playground 不会使用 Firebase

如何使用 Swift 在 Playground 中获取用户交互事件

如何制作多页 Swift Playground

如何将 UIButton 添加到 Swift Playground?

Swift Playground WebView 不会显示本地图像

在 Swift Playground 中捏手势?