如何解决swift 委托变量始终为零
我是一名相对较新的开发人员,经常使用协议/委托,但我坚持要正确实施这个协议/委托。我的视图控制器中有一个视图,它为 StarratingView 分配了一个类。我需要在 viewcontroller 类中捕获 StarratingView 生成的浮点值。
星级评分正常。由于某种原因,我只是无法设置委托变量。
这里是我定义协议和委托变量的地方。
protocol StarratingProtocol {
func receiveStarrating(_ touchedStarrating: Float)
}
@IBDesignable
class StarratingView: UIView {
var delegate: StarratingProtocol? //THIS IS ALWAYS NIL NOT GETTING SET
fileprivate func touched(touch: UITouch,movetouch: Bool) {
guard !movetouch || lastTouch == nil || lastTouch!.timeIntervalSince(Date()) < -0.1 else { return }
print("processing touch")
guard let hs = self.hstack else { return }
let touchX = touch.location(in: hs).x
let ratingFromTouch = 5*touchX/hs.frame.width
var roundedratingFromTouch: Float!
switch starRounding {
case .roundToHalfStar,.ceilToHalfStar,.floorToHalfStar:
roundedratingFromTouch = Float(round(2*ratingFromTouch)/2)
case .roundToFullStar,.ceilToFullStar,.floorToFullStar:
roundedratingFromTouch = Float(round(ratingFromTouch))
}
self.rating = roundedratingFromTouch
lastTouch = Date()
guard delegate != nil else {return}
delegate!.receiveStarrating(roundedratingFromTouch)
}
这是我的视图控制器类,我在其中设置协议并尝试设置委托值。我应该在 viewdidload 以外的地方设置委托值吗?
class LogController: UIViewController,StarratingProtocol {
@IBOutlet weak var starratingView: StarratingView!
@IBOutlet weak var labelStarrating: UILabel!
let starrating = StarratingView()
var testrating: Float?
override func viewDidLoad() {
super.viewDidLoad()
starrating.delegate = self
}
解决方法
问题在于,当您说 let starRating = StarRatingView()
时,这是您现在正在创建的新的和不同的 StarRatingView。那不是你想要的;您需要界面中已经存在的 StarRatingView。据推测,如果插座连接正确,那将是 self.starRatingView
。那就是您需要设置其委托的 StarRatingView。
另一个(不相关的)问题是 delegate
必须是 weak
。否则会出现retain cycle和内存泄漏。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。