swift委托变量始终为零

swift委托变量始终为零,swift,delegates,protocols,Swift,Delegates,Protocols,我是一个相对较新的开发人员,经常使用协议/代理,但我一直坚持正确实现这个协议。我的视图控制器中有一个视图,该视图为星空视图分配了一个类。我需要在viewcontroller类中捕获StartatingView生成的浮点值 星级评定很好。由于某种原因,我无法设置委托变量 这里是我定义协议和委托变量的地方 protocol StarRatingProtocol { func receiveStarRating(_ touchedStarRating: Float) } @IBDesig

我是一个相对较新的开发人员,经常使用协议/代理,但我一直坚持正确实现这个协议。我的视图控制器中有一个视图,该视图为星空视图分配了一个类。我需要在viewcontroller类中捕获StartatingView生成的浮点值

星级评定很好。由于某种原因,我无法设置委托变量

这里是我定义协议和委托变量的地方

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




问题是,当你说“让Starting=StarRatingView()”,这是你现在正在创建的一个新的、不同的StarRatingView。那不是你想要的;您需要界面中已存在的StartatingView。想必,如果插座连接正确,那就是self.staratingview。这就是您需要设置其代理的StartatingView


另一个(不相关的)问题是
委托
需要
。否则将出现保留周期和内存泄漏。

问题是,当您说
让starRating=StarRatingView()
时,这是您正在创建的一个新的、不同的StarRatingView。那不是你想要的;您需要界面中已存在的StartatingView。想必,如果插座连接正确,那就是self.staratingview。这就是您需要设置其代理的StartatingView


另一个(不相关的)问题是
委托
需要
。否则将出现保留周期和内存泄漏。

它起作用了!除了弱var部分。当我尝试设置弱var时,我得到一个错误:“弱”不能应用于非类绑定的“StarRatingProtocol”;考虑添加一个具有类绑定的协议一致性。我只是做了一点研究,并认为我发现了——向协议中添加“类”…我试试看。恐怕我对各种类型的变量名称相当无知,比如弱变量和静态变量等等。我需要了解所有这些……向协议中添加
是正确的,尽管在现代Swift中,我们被鼓励添加
任何对象
,而不是
。任何一个都可以。@aheze是的,他们为Swift 5.2或5.3(不记得了)宣布他们想要更改它,以使其与协议声明的其他用途保持一致,同时采用类限制(如
protocol P:UIView
)@aheze是的,我自己的问题又回来困扰我了!除了弱var部分。当我尝试设置弱var时,我得到一个错误:“弱”不能应用于非类绑定的“StarRatingProtocol”;考虑添加一个具有类绑定的协议一致性。我只是做了一点研究,并认为我发现了——向协议中添加“类”…我试试看。恐怕我对各种类型的变量名称相当无知,比如弱变量和静态变量等等。我需要了解所有这些……向协议中添加
是正确的,尽管在现代Swift中,我们被鼓励添加
任何对象
,而不是
。任何一个都可以。@aheze是的,他们为Swift 5.2或5.3(不记得了)宣布他们想要更改它,以使其与协议声明的其他用途保持一致,同时采用类限制(如
protocol P:UIView
)@aheze是的,我自己的问题再次困扰着我


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
    }