2016-05-18 5 views
0

Я последовал за инструкциями по делегированию в Objective C, которые полностью поняли концепцию, а затем попытаются реализовать ее быстро.Функция делегата возвращает nil

У меня есть пользовательский вид, наследующий класс «AppController» и NSObject, наследующий класс «SquareView».

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. Я чувствую, что я не связал делегата правильно, но я не знаю, как это сделать.

(я извиняюсь, я знаю, что многие люди задают этот вопрос уже, но их ответы до сих пор путают меня.)

ответ

1

Вы не установить AppController быть SquareView делегат, поэтому он не будет называться.

Попробуйте использовать приведенный ниже код, он должен работать.

override func awakeFromNib() { 
    squareView.needsDisplay = true 
    squareView.delegate = self 
} 
+0

Это работает! Спасибо! Я пытался сделать обратное, установив делегат в SquareView = AppController. –

+0

Рад слышать, хорошо провести день. –

1

Где вы назначили делегата? В AppController вы должны назначить значение делегата.

override func awakeFromNib() { 
    squareView.needsDisplay = true 
    squareView.delegate = self 
} 

А потом в SquareView, положить слабый делегату, сделать его необязательным и присвоить ноль:

weak var delegate: SquareViewDelegate? = nil; 

В DrawRect использовать делегат, как этот

let num: Int = delegate?.numberOfSquaresInQuareView(self) 
+0

Хорошая точка, +1 за ее слабый и дополнительный –

+0

Спасибо! так как я принял ответ, я бы дал вам +1. –

Смежные вопросы