SwiftUI 应用程序在两个选择器周围出现 VStack 崩溃

Posted

技术标签:

【中文标题】SwiftUI 应用程序在两个选择器周围出现 VStack 崩溃【英文标题】:SwiftUI App crashes with a VStack around two pickers 【发布时间】:2020-07-26 10:49:17 【问题描述】:

我已经找到了解决方案,但仍然想了解问题是什么,以便能够将其转移到类似的问题。

以这个示例代码为例:

import SwiftUI

struct ContentView: View 
    
    private var days = Array(1...31)
    @State private var selectedDay = 1
    
    private var months = [ "January", "February", "March", "April", "May", "June" ]
    @State private var selectedMonth = "January"
    
    
    var body: some View 
        NavigationView 
            Form 
                VStack 
                    Picker("Select day", selection: $selectedDay) 
                        ForEach(self.days, id: \.self)  day in
                            Text(String(day))
                        
                    
                    
                    Picker("Select month", selection: $selectedMonth) 
                        ForEach(self.months, id: \.self)  month in
                            Text(month)
                        
                    
                
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

如果您随后点击任何选择器,应用程序将在几秒钟后崩溃并显示 Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeed371fd8)

解决方案是移除 VStack。

但我仍然想了解如果有 VStack,应用程序为什么会崩溃?

添加 VStack 有什么问题?

【问题讨论】:

【参考方案1】:

Form 实际上是 List 并且 Form 的视图构建器中的每个 View 都被放入行中,因此将两个选择器组合到 VStack 中会导致将两个选择器放入一行中,当您点击该行时,选择器列表应该是显示? ...未知 - 因此这是崩溃的原因。

如果您想在表单中组合此类视图,请使用Section,例如

Form 
    Section 
        Picker("Select day", selection: $selectedDay) 
            ForEach(self.days, id: \.self)  day in
                Text(String(day))
            
        

        Picker("Select month", selection: $selectedMonth) 
            ForEach(self.months, id: \.self)  month in
                Text(month)
            
        
    

【讨论】:

所以,如果我猜对了:如果我添加 VStack 并点击一个 Picker,那么点击不会单独发送到这个 Picker,而是发送到该行中的所有视图? 至少如果你把两个按钮放在同一个场景中,那么两个动作都会被激活,所以是的,类似的事情,但更具破坏性,也会发生在选择器上。

以上是关于SwiftUI 应用程序在两个选择器周围出现 VStack 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中使用分段式选择器在两个页面之间滑动

SwiftUI 多组件选择器

SwiftUI 操作表选择器

SwiftUI 分段选择器默认状态为 nil

表单中的 SwiftUI 选择器 - 索引超出范围

如何在 SwiftUI 中将颜色选择器值保存到 UserDefaults 中?