使用委托从 UIView 子类向 UIViewController 发送数据
Posted
技术标签:
【中文标题】使用委托从 UIView 子类向 UIViewController 发送数据【英文标题】:Sending Data to UIViewController From UIView Subclass With Delegate 【发布时间】:2016-12-07 00:43:44 【问题描述】:我有一个连接到 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 的委托调用。我究竟做错了什么?感谢您的帮助。
【问题讨论】:
【参考方案1】:我发现了 2 个问题
-
您创建了一个新的 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
【讨论】:
太棒了!谢谢。以上是关于使用委托从 UIView 子类向 UIViewController 发送数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Nib 的情况下实例化和调用 UIView 子类
来自应用委托的 presentModalViewController
UIView 需要推送一个 UIViewController(委托)
带有 UIView 子类的 UITableViewCell 在单元格上创建多个图层