微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更改观察对象时如何刷新另一个单元格

如何解决更改观察对象时如何刷新另一个单元格

当我选择一个单元格时,我想从另一个单元格中取消选择它。进行选择后,我无法从上一个单元格中删除选择。这是什么原因?对不起。我不懂英文。

枚举

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)
                }
            }

enter image description here

解决方法

用有效的答案更新了我的答案。

问题在于您使用的是 @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)
]
,

以下是单选多选的方法。

  1. 对于单个选择,您可以将 Page 作为绑定传递给 subView。

  2. 对于多选,您可以维护一个布尔状态数组,它可以判断当前单元格是否已被选中。

单选

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,这也可以解决没有共享的问题!两种方式都有效!

enter image description here

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 举报,一经查实,本站将立刻删除。