SwiftUI:工作表第一次无法显示正确的值

Posted

技术标签:

【中文标题】SwiftUI:工作表第一次无法显示正确的值【英文标题】:SwiftUI: Sheet cannot show correct values in first time 【发布时间】:2020-11-12 05:00:40 【问题描述】:

我在 SwiftUI 中发现了奇怪的行为。

当我第一次点击列表列时,工作表显示空白文本。 第二次后似乎正确。

你会帮我吗?

import SwiftUI

let fruits: [String] = [
    "Apple",
    "Banana",
    "Orange",
]

struct ContentView: View 
    @State var isShowintSheet = false
    @State var selected: String = ""
    var body: some View 
        NavigationView 
            List(fruits, id: \.self)  fruit in
                Button(action: 
                    selected = fruit
                    isShowintSheet = true
                ) 
                    Text(fruit)
                
            
        
        .sheet(isPresented: $isShowintSheet, content: 
            Text(selected)
        )
    


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

list

first tap

after second tap

【问题讨论】:

【参考方案1】:

请改用.sheet(item:)。这是固定代码。

已通过 Xcode 12.1 / ios 14.1 验证

struct ContentView: View 
    @State var selected: String?
    var body: some View 
        NavigationView 
            List(fruits, id: \.self)  fruit in
                Button(action: 
                    selected = fruit
                ) 
                    Text(fruit)
                
            
        
        .sheet(item: $selected, content:  item in
            Text(item)
        )
    


extension String: Identifiable 
    public var id: String  self 

【讨论】:

很好,它对我有用??【参考方案2】:

谢谢你,奥米德。

我像这样使用 @State 从 Asperi 的代码中更改了我的代码。

import SwiftUI

struct Fruit: Identifiable, Hashable 
    var name: String
    var id = UUID()


let fruits: [Fruit] = [
    Fruit(name: "Apple"),
    Fruit(name: "Banana"),
    Fruit(name: "Orange"),
]

struct ContentView: View 
    @State var selected: Fruit?
    var body: some View 
        NavigationView 
            List(fruits, id: \.self)  fruit in
                Button(action: 
                    selected = fruit
                ) 
                    Text(fruit.name)
                
            
        
        .sheet(item: $selected, content:  item in
            Text(item.name)
        )
    

【讨论】:

还有其他方法,但答案应该尽可能接近提问!我对主题的回答最多 @Omid 我不确定这是不是真的。您使用的是全局变量和sheet(isPresented:content:),这对于本示例是错误的(我个人不会接受您的回答)。 Asperi 的解决方案sheet(item:content:) 是正确的。但是 omusubi 的创建 Fruit 结构的解决方案更好(并且可能应该被接受)。

以上是关于SwiftUI:工作表第一次无法显示正确的值的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 工作表在首次出现时不会访问状态变量的最新值

TabView 在 iOS13 SwiftUI 上无法正常工作

基于显示 2 选择的工作表视图的 SwiftUI 导航决策

SwiftUI:更改数据源时选择器无法正确更新

SwiftUI - 日期选择器未正确显示

SwiftUi 表在第一次点击时是空白的,但之后可以正常工作