我想在每次点击选项卡时运行一个函数。
在下面的代码中(通过使用onTapGesture
),当我点击新选项卡时,myFunction
会被调用,但选项卡视图不会更改。
struct DetailView: View {
var model: MyModel
@State var selectedTab = 1
var body: some View {
TabView(selection: $selectedTab) {
Text("Graphs").tabItem{Text("Graphs")}
.tag(1)
Text("Days").tabItem{Text("Days")}
.tag(2)
Text("Summary").tabItem{Text("Summary")}
.tag(3)
}
.onTapGesture {
model.myFunction(item: selectedTab)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到这两件事:
我有一张放在 foreach 循环之外的表。当我第一次单击 Tapgesture 时,结果为空白,第一次之后我点击的每一行都获得了正确的数据。我已阅读ForEach 内的 Sheet 不会循环遍历 SwiftUI 项目,但它仍然无法正常工作,这是我的代码。如果您查看我的代码,我有一个名为sharePost 的状态变量,点击它即可获取value.post的值,然后shareSheet切换设置为 true 。由于某种原因,我无法在第一次点击时获取该值。有谁对解决这个问题有任何建议
struct TimeLineView: View {
@Binding var model: [MainModel]
@Binding var isMainView: MainViewEnum
@State var shareSheet = false
@State var PostIDState = 0
@State var sharePost = ""
var body: some View {
ZStack
{
let result = model.sorted {
$0.id! > $1.id!
}
ForEach(result) { value in
HStack {
Image("share")
.resizable()
.frame(width: 28, height: 28)
.onTapGesture {
sharePost = …
Run Code Online (Sandbox Code Playgroud) 我的这个测试文件没有按我预期的方式工作。
import SwiftUI
struct SwiftUIView: View {
@State var boolTest = false
var nums = ["1","2","3","4","5","6","7"]
var body: some View {
VStack {
ForEach(nums, id: \.self) { num in
Text("\(num)")
.frame(width: 400)
.font(.system(size: 70))
.foregroundColor(boolTest ? .red : .green)
.onTapGesture {
boolTest.toggle()
}
}
}
}
}
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
SwiftUIView()
}
}
Run Code Online (Sandbox Code Playgroud)
当我点击数字时,前景色会按预期发生变化。但是,我希望能够点击左侧和右侧的区域,Text("\(num)")
因此我扩展了框架修改器来进行测试。然而,只有当我直接点击数字或文本时,颜色才会改变。
如何点击数字左侧或右侧的空间并使其改变颜色而不是不执行任何操作?
我有一个自定义视图的简单列表。需要发生的是,当选择其中一项时,它需要显示该项目的详细视图。在我的代码中,当我第一次选择一个项目时,@Statet selectedListener 不会被设置,因此详细视图不会出现。如果我继续选择先前选择的相同项目,则行为保持不变。但是,如果我选择不同的项目,它会正常工作,并且我可以返回上一个项目并查看其详细视图,而不会出现问题。这是一件非常简单的事情,我正在尝试做,只是无法弄清楚我可能做错了什么。任何帮助,将不胜感激。谢谢。
struct ListenersListView<Model>: View where Model: ActiveListenerViewModel {
@ObservedObject var viewModel: Model
@State var showDetail = false
@State var selectedListener: UserProfile? = nil
var body: some View {
ScrollView {
VStack(spacing:20) {
ForEach(viewModel.allActiveListeners) { listener in
UserImageSection(listener: listener,
subtext: listener.supportAreas)
.onTapGesture(perform: {
handleTap(listener)
})
}
}
}
.padding(.horizontal,20)
.sheet(isPresented: $showDetail, content: {
if let listener = selectedListener {
ListenerDetailView(listener: listener)
}
else {
// It should never come here but when the first item is selected it does. …
Run Code Online (Sandbox Code Playgroud)