【问题标题】:Ternary conditional not working in SwiftUI三元条件在 SwiftUI 中不起作用
【发布时间】:2021-02-23 15:29:53
【问题描述】:

谁知道 SwiftUI 是否支持三元条件?我有一个带有条件参数 (Text(badgeCount == nil ? " " :"\(badgeCount!)")) 的文本视图,它显示一个空视图。令人惊讶的是,如果我从视图中删除 @State 属性,它会起作用。

import SwiftUI

struct RedBadgeView: View {
    @State var badgeCount: Int?
    
    init (_ badgeCount: Int? = nil) {
        self.badgeCount = badgeCount
    }
    
    var body: some View {
        // Something about this Syntax is throwing off SwiftUI. 
        Text(badgeCount == nil ? " " :"\(badgeCount!)")
    }
}

struct RedBadgeView_Previews: PreviewProvider {
    static var previews: some View {
        RedBadgeView(1)
    }
}

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    这里根本不需要使用三元运算符。此外,在三元运算符中进行 nil 检查然后强制展开是一个坏主意。

    相反,您应该使用可选链接来访问badgeCountdescription,并提供" " 作为默认值。

    Text(badgeCount?.description ?? " ")
    

    但是,视图未更新的问题来自于您从未初始化 State 的事实,您只需为其包装的值分配一个值。要访问状态,需要在变量名前使用_前缀。

    init (_ badgeCount: Int? = nil) {
        self._badgeCount = State(initialValue: badgeCount)
    }
    

    【讨论】:

      【解决方案2】:

      确定三元条件有效。但是,您对 State 的初始化是错误的。您正在初始化一个常规 Int。

      init (_ badgeCount: Int? = nil) {
          self.badgeCount = badgeCount // >> If you initializing an Int
          self._badgeCount = State(initialValue: badgeCount) // >> If you initializing a State variable
      }
      

      因此,一切都将与 State 一起工作:

      struct ContentView: View {
          @State var badgeCount: Int?
          
          init (_ badgeCount: Int? = nil) {
              self._badgeCount = State(initialValue: badgeCount)
          }
          
          var body: some View {
              Text(badgeCount == nil ? " " :"\(badgeCount!)")
          }
      }
      

      【讨论】:

        【解决方案3】:

        除了其他答案之外,如果您使用的是 SwiftUI 2,您可以通过更多 swifty 方式进行操作,即直接在 @987654322 中使用 if-let @:

        var body: some View {
            if let badgeCount = badgeCount {
                Text(badgeCount)
            }
        }
        

        如果badgeCountnil,则body 将返回EmptyView。但是,您也可以返回一些其他视图:

        @ViewBuilder
        var body: some View {
            if let badgeCount = badgeCount {
                Text(badgeCount)
            } else {
                Text(" ")
            }
        }
        

        (首先您需要为badgeCount 初始化/分配一个值才能看到视图)。

        【讨论】:

          猜你喜欢
          • 2021-06-13
          • 2020-06-22
          • 1970-01-01
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-29
          相关资源
          最近更新 更多