gpt4 book ai didi

swift - 我可以在协议(protocol)中使用@IBOutlets吗(Swift)

转载 作者:可可西里 更新时间:2023-11-01 00:56:13 25 4
gpt4 key购买 nike

我有一个按以下方式定义的小协议(protocol):

import UIKit

protocol HasMeterAnimation {
func animateMeter(scrollableView: UIScrollView)
}

它的实现需要使用 IBOutlets:

func animateMeter(scrollableView: UIScrollView) {

let maxYPosTableview = scrollableView.frame.height + scrollableView.frame.origin.y
let progressBarRect = self.progressBar.frame
let rectOfProgressBarInParentView = self.convert(progressBarRect, to: scrollableView.superview)
let maxYPosMeter = rectOfProgressBarInParentView.origin.y + progressBarRect.height

if maxYPosTableview > maxYPosMeter {
if progressBar.isHidden == false {
progressBar.animateProgressBar()
model.shouldMeterAnimate = false
}
}
}

我想知道是否有办法使用 IBOutlets 在协议(protocol)扩展中编写此实现...像这样:

    protocol HasMeterAnimation {

@IBOutlet var progressBar:AnimatedProgressBar! { get set }
var model: ListItem! { get set }

func animateMeter(scrollableView: UIScrollView)
}

extension HasMeterAnimation {

func animateMeter(scrollableView: UIScrollView) {

let maxYPosTableview = scrollableView.frame.height + scrollableView.frame.origin.y
let progressBarRect = self.progressBar.frame
let rectOfProgressBarInParentView = self.convert(progressBarRect, to: scrollableView.superview)
let maxYPosMeter = rectOfProgressBarInParentView.origin.y + progressBarRect.height

if maxYPosTableview > maxYPosMeter {
if progressBar.isHidden == false {
progressBar.animateProgressBar()
model.shouldMeterAnimate = false
}
}
}

我尝试了很多方法,但总是报错。谢谢

最佳答案

IBOutlet 只是一个关键字,让界面构建器知道您想在您的类中引用来自界面构建器的对象,例如在您的 ViewController、View 等中。在任何其他上下文中,IBOutlet 没有任何意义。当您在协议(protocol)中定义属性时,您也不会将它们标记为强制展开。如果您没有将属性显式标记为可选,则该属性必须在运行时具有值,否则您无法编译代码。界面构建器将其导出标记为强制展开,因为它们在编译时没有值并在运行时解析。

关于swift - 我可以在协议(protocol)中使用@IBOutlets吗(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com