如何解决更改观察对象时如何刷新另一个单元格
当我选择一个单元格时,我想从另一个单元格中取消选择它。进行选择后,我无法从上一个单元格中删除选择。这是什么原因?对不起。我不懂英文。
枚举
enum Page {
case newest
case populer
case iPhone
case iPad
case mac
case watch
}
视图模型
class Mainviewmodel: ObservableObject {
@Published var selectedTab = Page.newest
}
类别模型
struct Category: Identifiable {
var id = UUID()
var title: String
var icon: String
var color: Color
var page: Page
}
基本类别
let basicCategory = [
Category(title: "En Yeniler",icon: "flame",color: .red,page: .newest),Category(title: "Popüler",icon: "star",color: .yellow,page: .populer),]
细胞
struct TabView: View {
var title: String = ""
var icon: String = ""
var color: Color
var page: Page
@Observedobject var macMainVM = Mainviewmodel()
var body: some View {
Button(action: {
withAnimation(.spring(response: 0.5,dampingFraction: 0.6,blendDuration: 0)) {
self.macMainVM.selectedTab = self.page
}
}) {
vstack {
Image(systemName: icon)
.imageScale(.large)
.foregroundColor(color)
Text(title)
.font(.custom("Oswald-Light",size: 14))
.fixedSize()
}
.padding(5)
//I emphasize the choice here
.background(self.macMainVM.selectedTab == self.page ? RoundedRectangle(cornerRadius: 10).stroke(color) : nil)
}
.buttonStyle(PlainButtonStyle())
}
}
ForEach
vstack {
ForEach(basicCategory,id: \.id) { item in
TabView(title: item.title,icon: item.icon,color: item.color,page: item.page)
}
}
解决方法
用有效的答案更新了我的答案。
问题在于您使用的是 @ObservedObject
而不是 @StateObject
父视图始终使用 @StateObject
,子视图始终使用 @ObservedObject
。
导入 SwiftUI
struct stackT: View {
@StateObject var macMainVM = MainViewModel()
var body: some View {
VStack {
ForEach(basicCategory,id: \.id) { item in
TabView(macMainVM: macMainVM,title: item.title,icon: item.icon,color: item.color,page: item.page)
}
}
}
}
struct stackT_Previews: PreviewProvider {
static var previews: some View {
stackT()
}
}
struct TabView: View {
@ObservedObject var macMainVM: MainViewModel
var title: String = ""
var icon: String = ""
var color: Color
let page: Page
var body: some View {
Button(action: {
withAnimation(.spring(response: 0.5,dampingFraction: 0.6,blendDuration: 0)) {
DispatchQueue.main.async {
self.macMainVM.globalTab = page
print(macMainVM.globalTab)
}
}
}) {
VStack {
Image(systemName: icon)
.imageScale(.large)
.foregroundColor(color)
Text(title)
.font(.custom("Oswald-Light",size: 14))
.fixedSize()
}
.padding(5)
//I emphasize the choice here
.background(self.macMainVM.globalTab == self.page ? RoundedRectangle(cornerRadius: 10).stroke(color) : RoundedRectangle(cornerRadius: 10).stroke(.clear))
}
.buttonStyle(PlainButtonStyle())
}
}
class MainViewModel: ObservableObject {
@Published var globalTab = Page.newest
}
enum Page {
case newest
case populer
case iPhone
case iPad
case mac
case watch
case none
}
struct Category: Identifiable {
var id = UUID()
var title: String
var icon: String
var color: Color
var page: Page
}
let basicCategory = [
Category(title: "En Yeniler",icon: "flame",color: .red,page: .newest),Category(title: "Popüler",icon: "star",color: .yellow,page: .populer),Category(title: "Another",icon: "book",color: .blue,page: .mac)
]
,
以下是单选和多选的方法。
-
对于单个选择,您可以将
Page
作为绑定传递给 subView。 -
对于多选,您可以维护一个布尔状态数组,它可以判断当前单元格是否已被选中。
单选
import SwiftUI
enum Page:String {
case newest
case populer
case iPhone
case iPad
case mac
case watch
}
struct Category: Identifiable {
var id = UUID()
var title: String
var icon: String
var color: Color
var page: Page
}
class MainViewModel: ObservableObject {
@Published var selectedTab = Page.newest
}
struct TabView: View {
var title: String = ""
var icon: String = ""
var color: Color = .red
var page: Page
@Binding var macMainVM :Page
var body: some View {
Button(action: {
withAnimation(.spring(response: 0.5,blendDuration: 0)) {
self.macMainVM = self.page
}
}) {
VStack {
Text("Tap")
.font(.custom("Oswald-Light",size: 14))
.fixedSize()
}
.padding(5)
//I emphasize the choice here
.background(self.macMainVM == self.page ? RoundedRectangle(cornerRadius: 10).stroke(color) : nil)
}
.buttonStyle(PlainButtonStyle())
}
}
struct mainView:View{
let basicCategory = [
Category(title: "En Yeniler",]
@ObservedObject var macMainVM = MainViewModel()
var body: some View {
VStack {
ForEach(basicCategory.indices) { index in
TabView(page: basicCategory[index].page,macMainVM: $macMainVM.selectedTab)
}
}
}
}
多选
import SwiftUI
enum Page:String {
case newest
case populer
case iPhone
case iPad
case mac
case watch
}
class MainViewModel: ObservableObject {
@Published var selectedTab = Page.newest
var stateArray:[Bool] = []
}
struct Category: Identifiable {
var id = UUID()
var title: String
var icon: String
var color: Color
var page: Page
}
struct TabView: View {
var title: String = ""
var icon: String = ""
var color: Color = Color.red
var page: Page
var count = 0
var onIndex:Int
@ObservedObject var macMainVM = MainViewModel()
init(totalPage:Int,page:Page,onIndex:Int) {
self.count = totalPage
self.page = page
self.onIndex = onIndex
macMainVM.stateArray = [Bool](repeating: false,count: totalPage)
}
var body: some View {
Button(action: {
withAnimation(.spring(response: 0.5,blendDuration: 0)) {
if macMainVM.stateArray[onIndex] == false{
macMainVM.stateArray[onIndex] = true
}else{
macMainVM.stateArray[onIndex] = false
}
macMainVM.selectedTab = self.page
}
}) {
VStack {
Text("Tap")
.font(.custom("Oswald-Light",size: 14))
.fixedSize()
}
.padding(5)
//I emphasize the choice here
.background(macMainVM.stateArray[onIndex] ? RoundedRectangle(cornerRadius: 10).stroke(color) : nil)
}
.buttonStyle(PlainButtonStyle())
}
}
struct mainView:View{
let basicCategory = [
Category(title: "En Yeniler",]
//var model = MainViewModel()
var body: some View {
VStack {
ForEach(basicCategory.indices) { index in
TabView(totalPage: basicCategory.count,page: basicCategory[index].page,onIndex: index)
}
}
}
}
注意-:我没有深入解释我所做的,因为通过查看代码会更容易理解。
,最简单的方法:您应该只使用共享对象,您每次都在创建一个新对象!我没有编辑你的代码!我只是使用了一个共享模型!这就是我所做的一切!或者你可以使用environmentObject,这也可以解决没有共享的问题!两种方式都有效!
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
ForEach(basicCategory,id: \.id) { item in
TabView(title: item.title,page: item.page)
}
}
.background(Color.gray)
}
}
enum Page {
case newest
case populer
case iPhone
case iPad
case mac
case watch
}
class MainViewModel: ObservableObject {
static let shared: MainViewModel = MainViewModel() // <<: Here
@Published var selectedTab = Page.newest
}
struct Category: Identifiable {
var id = UUID()
var title: String
var icon: String
var color: Color
var page: Page
}
let basicCategory = [
Category(title: "En Yeniler",Category(title: "iPhone",icon: "iphone.homebutton",page: .iPhone),Category(title: "ipad",icon: "ipad.homebutton",page: .iPad),]
struct TabView: View {
let title: String
let icon: String
let color: Color
let page: Page
@ObservedObject var macMainVM = MainViewModel.shared // <<: Here
var body: some View {
Button(action: {
withAnimation(.spring(response: 0.5,blendDuration: 0)) {
macMainVM.selectedTab = page
}
}) {
VStack {
Image(systemName: icon)
.imageScale(.large)
.foregroundColor(color)
Text(title)
.font(.custom("Oswald-Light",size: 14))
.fixedSize()
}
.padding(5)
.background(macMainVM.selectedTab == page ? RoundedRectangle(cornerRadius: 10).stroke(color) : nil)
}
.buttonStyle(PlainButtonStyle())
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。