刷新 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 环境对象的主要内容,如果未能解决你的问题,请参考以下文章
DrawerLayout和NavigationView的简单实用
SwiftUI嵌入Stack样式导航视图(NavigationView)中List显示怪异的解决