簡體   English   中英

使用委托從 UIView 子類向 UIViewController 發送數據

[英]Sending Data to UIViewController From UIView Subclass With Delegate

我有一個 IBOutlet 連接的UIView對象(innerView)坐在視圖控制器( UIViewController )的視圖上。 我想讓用戶用手指旋轉innerView。 所以我有一個UIView的子類(TouchView)設置為innerView的類。 當用戶旋轉視圖對象時,我希望視圖控制器從 TouchView 接收一個值。 我所擁有的是以下內容。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM