swift 委托变量始终为 nil
swift delegate variable is always nil
我是一个相对较新的开发人员,并且经常使用 protocols/delegates,但我坚持要正确实施这个。我的视图控制器中有一个视图,为 StarRatingView 分配了 class。我需要在 viewcontroller class 中捕获 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)
}
这是我的视图控制器 class,我在其中设置协议并尝试设置委托值。我应该在 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和内存泄漏。
我是一个相对较新的开发人员,并且经常使用 protocols/delegates,但我坚持要正确实施这个。我的视图控制器中有一个视图,为 StarRatingView 分配了 class。我需要在 viewcontroller class 中捕获 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)
}
这是我的视图控制器 class,我在其中设置协议并尝试设置委托值。我应该在 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和内存泄漏。