Swift / SwiftUI:如何检查环境 /binding var 是不是为空字符串(.isEmpty 出现构建错误)

Posted

技术标签:

【中文标题】Swift / SwiftUI:如何检查环境 /binding var 是不是为空字符串(.isEmpty 出现构建错误)【英文标题】:Swift / SwiftUI : how to check if environment /binding var is an empty string (.isEmpty got building error)Swift / SwiftUI:如何检查环境 /binding var 是否为空字符串(.isEmpty 出现构建错误) 【发布时间】:2021-05-30 02:02:38 【问题描述】:

每当按下并选择头像时,我都希望有一个模态视图。但是在使用绑定var的时候,没有办法知道是不是空字符串..

代码如下:

struct SelectAvatarView: View 
    var role: String
    @State var selectedAvatar: String?
    
    var body: some View 
        NavigationView
            
            ZStack 
                BackgroundView()

                VStack 
                    TitleTextView(title: "Choose your avatar:")
                    
                    if role == "Parent" 
                        
                        ParentAvatarView(selectedAvatar: $selectedAvatar)
                    
                    else
                        ChildAvatarView(selectedAvatar: $selectedAvatar)
                    
                    Spacer()
                .padding()
                .sheet(isPresented: !(self.$selectedAvatar.isEmpty) )  SimpleTestView()
            
            
        
    

问题是我不知道如何检查绑定变量$selectedAvatar。无论我写什么,错误都是:

Cannot convert value of type 'Binding<Bool>' to expected argument type 'Bool'

帮助!!!谢谢!!

【问题讨论】:

“按下并选中”是什么意思?您的代码中没有任何内容可以响应“按下”。从您的代码来看,您似乎只想在 selectedAvatar 不为空时才显示它,对吗?所以这意味着如果一旦工作表被关闭,系统就会将selectedAvatar 设置为空(假设您编写了自定义绑定)。这真的是你想要的吗? 选择和按下的触发器在这里是无关紧要的 - 任何 SwiftUI 开发人员都可以理解,因为它是在另一个视图中实现 onTapGesture 的。这不是这里的问题。问题只是:我想检查环境变量是否为空字符串但没有成功。 我只是在问一些问题以填补空白,因为它并不是真正的minimal reproducible example。我认为,如果您查看我在 SO 上的跟踪记录,您会发现我在回答 SwiftUI 问题方面有着相当出色的历史,但我确实首先尝试完全了解情况。我询问绑定如何响应的问题的原因是,似乎让工作表清除 selectedAvatar 一旦被解雇并不理想。因此,我试图更好地了解整个情况,以便更好地提供解决方案。 一般注释,当您使用 $variable 时,您正在访问变量的绑定(SwiftUI 在更新变量时使用),但是当您使用 variable 时,它是值(字符串在您的情况下)您正在访问。并且您想检查该值是否为空,而不是绑定 【参考方案1】:

我不知道你的视图架构如何。

但是在这里你可以通过下面的代码修复你的编译错误。

.sheet(isPresented: .constant(!(self.selectedAvatar?.isEmpty ?? false)) )  SimpleTestView()

【讨论】:

它没有解决,但感谢 Raja,我应该使用绑定 bool 类型。【参考方案2】:

对不起大家。 我是粗心的。

但我现在被 *** 的新“傲慢”伤害了。一个人在 Stack 中提出问题是最后的手段,因为他/她想要的最后一件事就是在所有其他专业和出色的开发人员面前用愚蠢的方式羞辱自己——这并不好玩。但是当被项目卡住时,我们不得不把脸/尊严扔到窗外。只是因为在问题描述中遗漏了细节,(当它与问题完全无关时),我认为它不值得“拇指向下”,更不用说一些了。

从长远来看,这种傲慢会损害最初拥有 *** 的目的。

isPresented 只需要Binding<Bool>,这就是为什么,提供 Bool 不起作用。

所以我找到了一个解决方法

现在一切正常:

//change avatar to struct Avatar (identifiable) 
@State var selectedAvatar: Avatar?

//change to "item" 
.sheet(item: self.$selectedAvatar ) avatar in AvatarSummaryView(avatar: avatar)


【讨论】:

以上是关于Swift / SwiftUI:如何检查环境 /binding var 是不是为空字符串(.isEmpty 出现构建错误)的主要内容,如果未能解决你的问题,请参考以下文章

检查pickerView SwiftUi中的选择

Swift UI 测试,如何检查单元格是不是有图像视图

Swift和SwiftUI

如何在 SwiftUI 中使用 Toast-Swift?

您将如何在 swiftUI/Swift 的滑块轨道中绘制节点?

如何在swift / SwiftUI中为滑动手势设置菜单栏图标的操作