2016-12-07 54 views
1

我有一個IBOutlet連接的UIView對象(innerView)坐在視圖控制器(UIViewController)的視圖。我想讓用戶用他們的手指旋轉innerView。所以我有一個UIView的子類(TouchView)設置爲innerView的類。當用戶旋轉視圖對象時,我希望視圖控制器從TouchView接收一個值。我擁有的是以下內容。發送數據到UIViewController從UIView子類與委託

// UIView 
protocol TouchDelegate: class { 
    func degreeChanged(degree: Double) 
} 

class TouchView: UIView { 
    weak var delegate: TouchDelegate? = nil 
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let aTouch: AnyObject = touches.first! as UITouch 
     let newLoc = aTouch.location(in: self.superview) 

     ... 
     ... 

     let degree = { (radians: Double) -> Double in 
      return radians * 180/M_PI 
     } 
     self.delegate?.degreeChanged(degree: degree) 
    } 
} 

// UIViewController 
class ViewController: UIViewController, TouchDelegate { 
    @IBOutlet weak var innerView: UIView! 

    // MARK: - View 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let touchView = TouchView() 
     touchView.delegate = self 
    } 

    // MARK: - From TouchView 
    func degreeChanged(degree: Double) { 
     print(degree) // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< no call 
    } 
} 

那麼,視圖控制器永遠不會從TouchView接收委託調用。我究竟做錯了什麼?感謝您的幫助。

回答

2

我看到兩個問題

  1. 你創造TouchView中的一個新實例,並沒有把它添加到您的視圖控制器的看法
  2. 你innerView不是TouchView中的實例,其委託未設置

我對你的情況的方法將是這個樣子:

// UIViewController 
class ViewController: UIViewController, TouchDelegate { 
@IBOutlet weak var innerView: TouchView! 

// MARK: - View 
override func viewDidLoad() { 
    super.viewDidLoad() 
    innerView.delegate = self 
} 

    // MARK: - From TouchView 
    func degreeChanged(degree: Double) { 
     print(degree) // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< no call 
    } 
} 
+0

好極了!謝謝。 –

相關問題