委托的函数返回nil

时间:2016-05-18 07:56:00

标签: swift delegates

我按照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。 我觉得我没有正确地联系代表,但我不知道如何。

(对不起,我知道很多人已经问过这个问题,但他们的回答仍然让我感到困惑。)

2 个答案:

答案 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)