2016-05-18 3 views
0

Objective Cの委託チュートリアルに続いて、その概念をかなり把握し、迅速に実装しようとしました。代理人の関数はnilを返す

"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を返します。 私はデリゲートを適切にリンクしていないように感じますが、どうしたらよいか分かりません。

(ごめんなさい、私が知っている多くの人がすでにこの質問をしているが、その答えはまだ私を混乱させる。)

答えて

1

あなたはSquareViewデリゲートであるためにあなたのAppControllerを設定しなかったので、それはしません呼び出される。

以下のコードで試してみるとうまくいくはずです。

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に、デリゲートに弱い入れ、それをオプションにしてnilに割り当てる:のdrawRectで

weak var delegate: SquareViewDelegate? = nil; 

は、それが動作します。この

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

良い点、弱くてオプションのための+1 –

+0

ありがとう!私が答えを受け入れたので、私はあなたに+1を与えるだろう。 –

関連する問題