- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想根据来自另一个 View (LeftView) 中点击手势的操作来更新 View (RightView)。下面是我实现此目的的示例代码:
AppState.swift
import Foundation
class AppState: ObservableObject {
@Published var tapCount: Int = 0
func incrementTapCount() {
self.tapCount += 1
print("tap count \(self.tapCount)")
}
}
LeftView.swift
import SwiftUI
struct LeftView: View {
@ObservedObject var appState = AppState()
var body: some View {
VStack {
Text("Left View")
}
.frame(width: 100, height: 200)
.onTapGesture {
print("tapped left view")
self.appState.incrementTapCount()
}
}
}
RightView.swift
import SwiftUI
struct RightView: View {
@ObservedObject var appState = AppState()
var body: some View {
VStack {
Text("Right View")
Text("Tap Count: \(self.appState.tapCount)")
}.frame(width: 200, height: 200)
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
var body: some View {
HStack {
LeftView()
RightView()
}.frame(width: 300, height: 200)
}
}
不幸的是,RightView 文本不会随点击次数更新。但是,如果我在 ObservableObject 类中使用计时器来更新点击计数,则 RightView 会正确更新。
import Foundation
class AppState: ObservableObject {
@Published var tapCount: Int = 0
init() {
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
self.tapCount += 1
}
}
func incrementTapCount() {
self.tapCount += 1
print("tap count \(self.tapCount)")
}
}
为什么 LeftView 中的点击手势没有更新 RightView 文本?
最佳答案
LeftView
和 RightView
各自初始化各自的 AppState
对象,因此它们不会观察到相同的状态。
在您的两个 View 中,将 @ObservedObject
保留为未初始化的属性:
LeftView.swift & RightView.swift
@ObservedObject var appState: AppState
当您在 SwiftUI View 中有这样一个未初始化的属性时,您需要在任何时候想要使用该 View 时为其提供一个值。
PreviewProvider
使用您的 View 实例,因此 Xcode 可以在 Canvas 上向您显示它,它只需要您为 提供一个占位符值应用状态
。该值并不是很重要(除了 Xcode Canvas 外,它没有在任何地方使用)所以您只需要提供正确类型的东西:
#if DEBUG
struct LeftView_Previews: PreviewProvider {
static var previews: some View {
LeftView(appState: AppState())
}
}
#endif
最后,在 ContentView
中,您需要将对单个 shared AppState
的引用传递到 LeftView
和 RightView
这样他们就可以分别观察同一个对象:
ContentView.swift
import SwiftUI
struct ContentView: View {
var sharedAppState = AppState()
var body: some View {
HStack {
LeftView(appState: sharedAppState)
RightView(appState: sharedAppState)
}.frame(width: 300, height: 200)
}
}
现在两个 View 都在观察 AppState
的同一个实例,当它的属性发生变化时它们都会更新。
您还可以使用 @EnvironmentObject
在您应用中的所有 View 之间共享状态,但由于我们在这里只关心两个 View @ObservedObject
是一个务实的选择。
关于SwiftUI onTapGesture 不适用于 Mac 应用程序中的 ObservedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348113/
我按照 MengTo 的示例说明了如何在 SwiftUI 中播放 Lottie 动画。 ( https://www.youtube.com/watch?v=fVehE3Jf7K0 ) 但是,我想知道是
我尝试重新实现我正在使用的 SegmentedControlers,因为它们在 Xcode 11 beta 5 中已被弃用。这花了一段时间但我得到了我想要的外观。但是,当我用 onTapGesture
在 SwiftUI View 中,我通过创建一个 VStack 来实现一个垂直滚动列表,该 VStack 包含一个包含一些文本的 NavigationView。我通过循环遍历popularFeedTy
有一些渲染图像,需要确定相对于图像的点击位置。看似简单,却找不到答案 var body: some View { VStack { Image(uiImage: drawRec
我试图在选择按钮时更改按钮的颜色。当我按下按钮时没有任何变化。似乎 .onTapGesture 不适用于自定义 View 。 我尝试使用按钮而不是 .onTapGesture,但它也不起作用。 .co
附件是一个简单的 SwiftUI 结构,它显示了一组“扩展按钮”。我显示顶部按钮(其他 3 个是 1x1,在顶部按钮后面。)当用户点击顶部按钮时,它会扩展到 40x40 并以漂亮的动画移动下面的按钮。
我正在通过代码制作动态 UIViews 并尝试在它们上面添加 UITapGestureRecogniser。但出于某种原因,他们没有回应。这是代码: -(void)createRandomBlock{
SWiftUI 中的 onTapGesture 不能可靠地工作。此示例显示了问题,即有时当您点击一个单元格时,背景会按原样变为灰色,而另一次相邻单元格发生变化,而其他时候根本没有任何 react 。任
这个问题在这里已经有了答案: SwiftUI: How to make entire shape recognize gestures when stroked? (1 个回答) 12 个月前关闭。
我偶然发现了一个与 SwiftUI 的 ScrollView 相关的事件冒泡问题。并且已经能够将其简化为一小段代码。请看下面: struct ContentView: View { var bod
我想根据来自另一个 View (LeftView) 中点击手势的操作来更新 View (RightView)。下面是我实现此目的的示例代码: AppState.swift import Foundat
我目前有一个 UIView,称之为 (A),已外包给第三方库。物理上按下 onTapGesture 很简单,但这里的问题是这个 (A) 在另一个 View 层次结构上,而不是我的 View 层次结构。
我正在开发具有以下 ContentView 结构的应用程序 ContentView { ---HeaderView ---Collection view using QGrid
我们可以使用 map 和 reduce 函数创建组合 TextView (不是逐行)。 struct ContentView: View { @State private var boolArr =
我有简单的看法。 var body: some View { NavigationView { ZStack { ScrollView {
当我从垂直 ScrollView (ForEach)滚动项目并点击水平 View 中的项目时,我在 VStack 中有一个水平 ScrollView (ForEach)和垂直 ScrollView (
我正在定制 Picker在 SegmentedPickerStyle() .我想有相同的行为,但是当我点击内容和其中一个可能选择的边框之间的区域时,onTapGesture不起作用。当我添加蓝色背景时
我有一个小 View ,我想在屏幕上移动并可点击。所以我添加了一个 UIPanGestureRecognizer 来移动它,并添加了一个 UITapGestureRecognizer 来接收点击事件,
我在我的应用程序中有一个显示矩形卡片列表的布局 - 每个卡片都应该可以点击(一次)以显示一组操作按钮和更多信息等。 我已经使用 .onTapGesture() 实现了这个我也放了.contentSha
我是一名优秀的程序员,十分优秀!