2016-05-18 3 views
0

Ich folgte eine Delegation Tutorial in Objective C ziemlich begriffen das Konzept, und dann versuchen, es in swift zu implementieren.Delegate-Funktion gibt Null

Ich habe eine benutzerdefinierte Ansicht erben "AppController" -Klasse, und ein NSObject erbt "SquareView" -Klasse.

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)) 
     } 
    } 
} 

Wenn ich erstellen und auszuführen, nil meine delegate.numberOfSquaresInSquareView kehrt zurück. Ich habe das Gefühl, dass ich den Delegierten nicht richtig verbunden habe, aber ich weiß nicht wie.

(tut mir leid, ich weiß, dass viele Leute fragen, haben diese Frage bereits, aber ihre Antworten mich noch verwirren.)

Antwort

1

Sie nicht Ihre AppController gesetzt hat der SquareView Delegierter zu sein, so wird es nicht heißen.

Versuchen Sie mit dem Code unten, es sollte funktionieren.

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

Es funktioniert! Danke! Ich habe versucht, das Gegenteil zu tun, Delegat in SquareView = AppController setzen. –

+0

Freut mich zu hören, einen schönen Tag. –

1

Wo haben Sie den Delegierten zugewiesen? In AppController müssen Sie den Wert des Delegaten zuweisen.

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

Und dann in SquareView, setzen schwach an den Delegaten, machen es optional und weisen auf Null:

weak var delegate: SquareViewDelegate? = nil; 

In DrawRect wie die der Delegat verwenden diese

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

Guter Punkt, +1 für die machen es schwach und optional –

+0

Vielen Dank! Da ich eine Antwort angenommen habe, würde ich dir +1 geben. –