我可以在协议中使用@IBOutlets (Swift)
Can I use @IBOutlets in Protocols (Swift)
我有一个按以下方式定义的小协议:
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 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 只是一个关键字,让界面构建器知道您想在 class 中引用来自界面构建器的对象,例如在您的 ViewController、View 等中。在任何其他上下文 IBOutlet 没有任何意义。当您在协议中定义属性时,您也不会将它们标记为强制展开。如果您没有将 属性 显式标记为可选,则 属性 必须在运行时具有值,否则您无法编译代码。界面生成器将其出口标记为强制展开,因为它们在编译时没有值并在运行时解析。
我有一个按以下方式定义的小协议:
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 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 只是一个关键字,让界面构建器知道您想在 class 中引用来自界面构建器的对象,例如在您的 ViewController、View 等中。在任何其他上下文 IBOutlet 没有任何意义。当您在协议中定义属性时,您也不会将它们标记为强制展开。如果您没有将 属性 显式标记为可选,则 属性 必须在运行时具有值,否则您无法编译代码。界面生成器将其出口标记为强制展开,因为它们在编译时没有值并在运行时解析。