SwiftUI-导航时视图是否保持活动状态?

史蒂夫·弗雷泽

使用NavigationLinks和ObservableObject时出现错误。我不太清楚为什么,因为我在浏览时不了解视图和数据发生了什么。这是一些伪代码来说明此问题:

class Settings: ObservableObject {
    @Published var data: [Int] = [0, 1, 2, 3, 4, 5]
}

struct ContentView: View {
    @State var new_view: Bool = false
    @ObservedObject var content_view_settings = Settings()
    
    var body: some View {
        NavigationView {
            VStack {
                Button(action: {
                    DeleteLastItem()
                }) {
                    Text("Delete last item")
                }

                Button(action: {
                    self.new_view = true
                }) {
                    Text("New View")
                }
                
                NavigationLink(destination: NewView(new_view_settings: content_view_settings), isActive: $new_view) {
                    EmptyView()
                }
            }
        }
    }
}

struct NewView: View {
    @ObservedObject var new_view_settings: Settings
    @State var index = -1
    
    var body: some View {
        VStack {
            Button(action: {
                self.index = self.new_view_settings.count - 1
            }) {
                Text("change index")
            }

            if self.index > -1 {
                Text("\(self.new_view_settings.data[index])")
            }  
        }
    }
}

问题的描述是这样的:

我有一个带有ObservedObject的视图,该视图在导航时传递给后续视图。该子视图访问数组的最后一个元素,但是只有在通过单击按钮验证了索引变量后,才执行此操作。然后,仅在索引经过验证后才呈现文本。

现在,假设我验证了索引,因此在此示例中它等于5。然后,我导航回到原始视图。如果删除最后一个元素,则索引5不再有效。删除最后一个元素后,我立即得到无效的索引错误,模拟器崩溃。

但是,假设我向后导航并且不删除最后一个元素。然后,当我向前导航时,将重置索引变量。

自从我崩溃后,这意味着该视图仍处于活动状态并正在更新,但是当我再次导航至该视图时,该视图将重新加载。这是否意味着该视图在重新初始化之前还处于活动状态?这是人为的代码,但本质上是我遇到的问题。我认为原始代码会更难理解。

pawello2222

这是否意味着该视图在重新初始化之前还处于活动状态?

是的,即使您导航回到父视图,该视图也可能仍处于活动状态。


为了更好地了解正在发生的事情,请在iPad模拟器上运行相同的代码(最好在水平模式下)。您会注意到,NavigationView它分为两部分:视图详细信息-这样,您可以同时看到父视图和子视图。

现在,如果您从问题中执行相同的实验,即使向后导航,也会看到子视图仍然存在。在iOS上也是如此。

一种防止这种情况的方法是检查数组中是否存在索引:

struct NewView: View {
    @ObservedObject var new_view_settings: Settings
    @State var index = -1

    var body: some View {
        VStack {
            Button(action: {
                //self.index = self.new_view_settings.count - 1
            }) {
                Text("change index")
            }

            // check if `index` is in array
            if self.index > -1 && self.index < self.new_view_settings.data.count {
                Text("\(self.new_view_settings.data[index])")
            }
        }
    }
}

注意:通常,我不建议在SwiftUI视图中处理索引-通常有更好的方法来传递数据。处理指数是有风险的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SwiftUI:更新导航栏颜色

来自分类Dev

SwiftUI导航多个后退按钮

来自分类Dev

在SwiftUI中堆叠视图

来自分类Dev

SwiftUI从视图传递参数

来自分类Dev

SwiftUI视图不会更新

来自分类Dev

SwiftUI更新导航操作状态

来自分类Dev

不同视图之间的SwiftUI导航

来自分类Dev

隐藏导航栏Swiftui

来自分类Dev

宽度为0的swiftUI按钮仍处于活动状态

来自分类Dev

使用SwiftUI导航视图和已排序的FetchRequest在详细信息视图中重新排列列表项时的问题

来自分类Dev

使用Canvas预览SwiftUI视图时出错

来自分类Dev

SwiftUI从列表导航到其他视图

来自分类Dev

单一视图的macOS SwiftUI导航

来自分类Dev

在SwiftUI中存在多个导航视图时隐藏导航栏

来自分类Dev

SwiftUI视图在更改@ObservedObject时未更新

来自分类Dev

SwiftUI如何在保持后退按钮的同时隐藏导航栏

来自分类Dev

包含按钮的SwiftUI导航链接

来自分类Dev

双导航栏SwiftUI

来自分类Dev

隐藏的Swiftui进度视图

来自分类Dev

NavigationLink视图参数SwiftUI

来自分类Dev

SwiftUI导航栏标题

来自分类Dev

从UIViewController导航到SwiftUI视图

来自分类Dev

.onAppear运行SwiftUI时,视图未刷新

来自分类Dev

SwiftUI确定初始视图

来自分类Dev

SwiftUI CloudKit在保持活动状态时不刷新视图

来自分类Dev

在SwiftUI中,同一视图中是否具有标签栏和导航栏?

来自分类Dev

导航视图移动了我的目标视图SwiftUI

来自分类Dev

SwiftUI视图在初始拖动时跳转

来自分类Dev

根据保存的状态在 SwiftUI 中自动激活动画