我有一个UIPageViewController,它被封装在一个SwiftUI视图中。视图是用@Binding值实例化的:
PageView([Text("Hello")], currentPage: $page)我有一些内部状态,我想根据传入的@Binding变量进行更改。
@State var currentPageIndex: Int
@State var goRight: Bool?
public var currentPage: Binding<Int> {
Binding(
get: {
return self.currentPageIndex
},
set: {
self.goRight = ((self.currentPageIndex - $0) > 0)
self.currentPageIndex = $0
}
)
}当我尝试根据这个索引设置UIPageViewController时,
pageViewController.setViewControllers([controllers[currentPage]], direction: .forward, animated: true)此行因错误Cannot convert value of type 'Binding<Int>' to expected argument type 'Int'而失败
然而,当我只使用一个@Binding值而不做任何处理时,
@Binding var currentPage: Int一切都很好。我理解这个问题的核心是,@Binding var blah: Int和var blah: Binding<Int>之间有某种区别,为什么会这样呢?为什么要访问类型Binding<Int>的底层值还要做一些其他的事情呢?我理解这些东西是两种不同的方式来表达相同的东西。或者它们不是同等的?
发布于 2020-07-21 20:23:11
使用
@Binding var blah: Intblah是一个Int,@Binding是一个属性包装器,它通过$blah (一种Binding<Int>类型)投影一个值。所以,他们是不一样的。
类似地,@State属性包装器将生成一个Binding。因此,您实际上不需要创建一个计算属性,就像对public var currentPage: Binding<Int>所做的那样。你可以这样做:
self.$currentPageIndex但是,如果需要从Binding<T>访问基础值,则可以使用.wrappedValue属性
发布于 2020-07-21 20:48:30
@Binding var blah: Int变成了
var _blah: Binding<Int>
var blah: Int {
get {
_blah.wrappedValue
}
set {
_blah.wrappedValue = newValue
}
}这意味着,如果您有一个@Binding var foo: Int和var bar: Binding<Int>,下面是您如何做类似的事情:
struct MyView: View {
//assume these are correctly initialized
@Binding var foo: Int
var bar: Binding<Int>
var body: some View {
//some body
}
func example() {
// these are equivalent
foo == bar.wrappedValue
_foo == bar
}
}https://stackoverflow.com/questions/63022030
复制相似问题