Ios 使用委托从UIView子类向UIViewController发送数据

Ios 使用委托从UIView子类向UIViewController发送数据,ios,swift,uiview,uiviewcontroller,swift3,Ios,Swift,Uiview,Uiviewcontroller,Swift3,我有一个IBOutlet连接到视图控制器(UIViewController)视图上方的UIView对象(内部视图)。我想让用户用手指旋转innerView。因此,我将UIView的子类(TouchView)设置为innerView的类。当用户旋转视图对象时,我希望视图控制器从TouchView接收一个值。我有以下几点 // UIView protocol TouchDelegate: class { func degreeChanged(degree: Double) } class

我有一个IBOutlet连接到视图控制器(
UIViewController
)视图上方的
UIView
对象(内部视图)。我想让用户用手指旋转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
    }
}
//UIView
协议代理:类{
功能度更改(度:双)
}
类TouchView:UIView{
弱变量委托:TouchDelegate?=nil
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
让aTouch:AnyObject=touch.first!作为UITouch
让newLoc=aTouch.location(在:self.superview中)
...
...
设阶={(弧度:双)->双精度
返回弧度*180/M_PI
}
自我授权?.degree更改(学位:学位)
}
}
//UIViewController
类ViewController:UIViewController、TouchDelegate{
@IBVAR内部视图:UIView!
//马克:-视图
重写func viewDidLoad(){
super.viewDidLoad()
让touchView=touchView()
touchView.delegate=self
}
//马克:-来自TouchView
功能度更改(度:双){
打印(学位)/我发现两个问题

  • 您创建了touchView的新实例,但未将其添加到视图控制器的视图中
  • 您的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
        }
    }
    
    //UIViewController
    类ViewController:UIViewController、TouchDelegate{
    @IBVAR内部视图:TouchView!
    //马克:-视图
    重写func viewDidLoad(){
    super.viewDidLoad()
    innerView.delegate=self
    }
    //马克:-来自TouchView
    功能度更改(度:双){
    
    打印(学位)//太好了!谢谢。