【发布时间】:2020-09-10 17:48:12
【问题描述】:
点击手势由以下函数触发;
@objc func handleTapGR(tapGR: UITapGestureRecognizer) {
let tapLocation = tapGR.location(in: nil)
let moveNext = tapLocation.x > frame.width / 2 ? true : false
moveNext ? userCards.nextImage() : userCards.previousImage()
}
用户卡视图模型:
...
var imageIndex: Int = 0 { didSet{ imageIndexObserver?(imageIndex, userImages[imageIndex]) } }
var imageIndexObserver: ((Int, UIImage) -> () )?
mutating func nextImage() {
imageIndex = imageIndex + 1 >= userImages.count ? 0 : imageIndex + 1
}
mutating func previousImage() {
imageIndex = imageIndex - 1 < 0 ? userImages.count - 1 : imageIndex - 1
}
索引改变时需要触发相关的闭包。 下面的对象在相关视图中。
var userCards: UserCardViewModel! {
didSet{
userCards.imageIndexObserver = { index, image in
self.showingImage.image = self.userCards.userImages[index]
print(index)
}
}
}
前两次点击时,我无法在索引语句上方打印。当我在图像上按下右侧时(相关数组计数为 2)
- 第一次点击;什么都没有发生。
- 第二次点击;打印 0。
- 第三次,它打印 index = 1。
我正在这样初始化(来自相关的视图控制器)
convenience init(userCards: UserCardViewModel) {
self.init(frame: .zero)
self.userCards = userCards
configure()
}
【问题讨论】:
-
你想在右击时增加
imageIndex,在左击时减少...对吗?? -
点击手势工作正常,只是值观察者不能正确通信。
-
是的,因为我正在检查它是否工作正常.. 就像第一次 imageIndex 的初始值为 0。如果点击右侧,它将变为 1,如果我点击左侧的值,则第一次变成 3 (即 yourArray.count - 1)....那么你能告诉我你期望什么输出吗?
-
让我们说 userImages.count = 2 我点击了右上角。我期望得到 index=2 但打印功能不起作用。
-
如果您的数组计数为 2 并且您期望
imageIndex= 2,则应用程序将崩溃 bcoz 数组有 2 个计数并且您尝试访问第三个元素....array[2] 这将崩溃
标签: swift memory-management closures uitapgesturerecognizer observers