我正在编写一个简单的金属应用程序。
我试图将视图和渲染分开。因此,我编写了一个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。我认为我不应该再被问到问题了。
答案 0 :(得分:2)
问题是这一行:
view.delegate = ViewController()
...制作一个 second ViewController,将 it 设为delegate
,然后将其扔掉。
You (包含此代码的类)是要成为其委托的ViewController。所以你需要说:
view.delegate = self
当您说self
是一个持久对象时,它会起作用。另一个ViewController()
出现并再次消失。它没有持久性,因此无能为力。
您为什么说view.delegate = self
是错误的?这是正常现象,并且可以正常工作。