MTKView委托不起作用

时间:2018-08-21 03:00:49

标签: swift metal

我正在编写一个简单的金属应用程序。

我试图将视图和渲染分开。因此,我编写了一个MTKViewDelegate类来进行渲染工作,并为其设置视图的委托。但这行不通。但是,当我将视图控制器实例作为委托时,它就可以工作。

打击是我的代码

class ViewController: UIViewController,MTKViewDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    let view = self.view as! MTKView
    //view.delegate = self              //this works,print 'drawing'
    view.delegate = ViewController()    //this does not work, not print anyting
    print("view did load")
}

func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
    print("change size")
}

func draw(in view: MTKView) {
    print("drawing")
}
}

为什么会这样?

更新

我真正的意思是,为什么当我将ViewController的当前实例设置为视图的委托时,它可以工作,但是当我创建一个新实例时,它却无法工作。

我真正想做的是使一个渲染类作为MTKView的委托来进行渲染工作。但这没有用,所以我用ViewController对其进行了测试。

感谢马特的回答,我知道原因是,MTKView的委托属性被弱引用,因此它无法容纳新创建的MTKViewDelegate实例。新创建的实例由垃圾回收器回收。

我所需要的只是MTKViewDelegate的proxy属性是'weak'。当人们没有注意到这一点时,情况就会令人困惑。

所以,我认为我的问题很有价值,它不像问题Swift can't call protocol method via delegate。我认为我不应该再被问到问题了。

1 个答案:

答案 0 :(得分:2)

问题是这一行:

view.delegate = ViewController()

...制作一个 second ViewController,将 it 设为delegate,然后将其扔掉。

You (包含此代码的类)是要成为其委托的ViewController。所以你需要说:

view.delegate = self

当您说self是一个持久对象时,它会起作用。另一个ViewController()出现并再次消失。它没有持久性,因此无能为力。

您为什么说view.delegate = self是错误的?这是正常现象,并且可以正常工作。