我按照Objective C中的委托教程完全掌握了这个概念,然后尝试在swift中实现它。
我有一个继承“AppController”类的自定义视图,以及一个继承“SquareView”类的NSObject。
AppContoller.swift
import Cocoa
class AppController: NSObject,SquareViewDelegate {
var squareCount:Int = 10
@IBOutlet var squareView: SquareView!
override func awakeFromNib() {
squareView.needsDisplay = true
}
@IBAction func changeSquareCount(sender:AnyObject) {
squareCount = Int(sender.intValue)
squareView.needsDisplay = true
}
func numberOfSquaresInQuareView(squareView: SquareView) -> Int {
return squareCount
}
}
SquareView.swift
import Cocoa
import Foundation
protocol SquareViewDelegate {
func numberOfSquaresInQuareView(squareView:SquareView)->Int
}
class SquareView: NSView {
var delegate: SquareViewDelegate!
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
NSColor.redColor().set()
let num: Int = delegate.numberOfSquaresInQuareView(self)
for _ in 0..<num {
let x:CGFloat = CGFloat(arc4random()) % CGFloat(self.frame.size.width - 20)
let y:CGFloat = CGFloat(arc4random()) % CGFloat(self.frame.size.width - 20)
NSRectFill(NSMakeRect(x, y, 10, 10))
}
}
}
当我构建并运行时,我的delegate.numberOfSquaresInSquareView返回nil。 我觉得我没有正确地联系代表,但我不知道如何。
(对不起,我知道很多人已经问过这个问题,但他们的回答仍然让我感到困惑。)
答案 0 :(得分:1)
您没有将AppController设置为SquareView委托,因此不会调用它。
尝试使用下面的代码,它应该可以正常工作。
override func awakeFromNib() {
squareView.needsDisplay = true
squareView.delegate = self
}
答案 1 :(得分:1)
你在哪里指派代表?在AppController中,您必须分配委托的值。
override func awakeFromNib() {
squareView.needsDisplay = true
squareView.delegate = self
}
然后在SquareView中,将weak放到委托中,使其成为可选项并分配给nil:
weak var delegate: SquareViewDelegate? = nil;
在DrawRect中使用像这样的委托
let num: Int = delegate?.numberOfSquaresInQuareView(self)