刷新 NavigationView 环境对象

Posted

技术标签:

【中文标题】刷新 NavigationView 环境对象【英文标题】:Refreshing NavigationView Environment Object 【发布时间】:2019-08-30 15:53:28 【问题描述】:

我正在尝试创建一个可编辑的环境对象并将其放入列表中。 变量只有在我切换选项卡时才会刷新(所以每当我离开 NavigationView 时)然后回来。

之前的 ModalView 也是如此。这可能是一个错误吗?还是我做错了什么?

import SwiftUI
import Combine

struct TestView: View 

    @State var showSheet: Bool = false
    @EnvironmentObject var feed: TestObject
    func addObjects() 
        var strings = ["one","two","three","four","five","six"]
        for s in strings 
            var testItem = TestItem(text: s)
            self.feed.items.append(testItem)
        
    

    var body: some View 
        TabView 
            NavigationView 
                List(feed.items.indices, id:\.self)  i in
                    NavigationLink(destination: detailView(feed: self._feed, i: i)) 
                        HStack 
                            Text(self.feed.items[i].text)
                            Text("(\(self.feed.items[i].read.description))")
                        
                    
                
            
                .tabItem( Text("Test") )
                .tag(0)

            Text("Blank")
                .tabItem( Text("Test") )
                .tag(0)
        .onAppear 
            self.addObjects()
        
    


struct detailView: View 
    @EnvironmentObject var feed: TestObject
    var i: Int
    var body: some View 
        VStack 
            Text(feed.items[i].text)
            Text(feed.items[i].read.description)
            Button(action:   self.feed.items[self.i].isRead.toggle() ) 
                Text("Toggle read")
            
        
    


final class TestItem: ObservableObject 
    init(text: String) 
        self.text = text
        self.isRead = false
    
    static func == (lhs: TestItem, rhs: TestItem) -> Bool 
        lhs.text < rhs.text
    
    var text: String
    var isRead: Bool

    let willChange = PassthroughSubject<TestItem, Never>()
    var read: Bool 
        set 
            self.isRead = newValue
        
        get 
            self.isRead
        
    


class TestObject: ObservableObject 
    var willChange = PassthroughSubject<TestObject, Never>()

    @Published var items: [TestItem] = [] 
        didSet 
            willChange.send(self)
        
    

【问题讨论】:

我想通了。有两种解决方案(一种解决方法和一种解决方案) 您能与社区分享解决方案吗? 请分享大声笑 【参考方案1】:

尝试在目的地传递 .environmentObject:

NavigationLink(destination: detailView(feed: self._feed, i: i).environmentObject(x))

【讨论】:

【参考方案2】:
    您必须使用 willSet 而不是 didSet。 TestItem 应该是一个值类型:结构或枚举。 SwiftUI 的观察系统仅适用于值类型。

【讨论】:

ObservableObject 使用 willSet 调用 objectWillChange.send()。这是由@Published 处理的。 willChange 发布者似乎未使用。 SwiftUI 的观察系统仅适用于类,IIRC 你不能将结构声明为 ObservableObject。

以上是关于刷新 NavigationView 环境对象的主要内容,如果未能解决你的问题,请参考以下文章

用户登录时更改 NavigationView 项目

如何在 NavigationView 中获取菜单项?

DrawerLayout和NavigationView的简单实用

SwiftUI嵌入Stack样式导航视图(NavigationView)中List显示怪异的解决

Swiftui [BUG] NavigationView 和 List 仅在 iPad 模拟器上不显示

navigationView中如何补充UIScrollView?