【问题标题】:Swiftui function to change variableSwiftui函数改变变量
【发布时间】:2021-04-29 21:26:32
【问题描述】:

我正在尝试在不同点更新变量(将其从 1 更改为 0,反之亦然)。

我有一个可观察的对象:

    class GameSettings: ObservableObject {
    @Published var score = 1
    @Published var alert = 0
    @Published var displayNavButtons = 1
}

一个改变 displayNavButtons 的函数:

    func toggleNavButtonsOff(gamesettings: inout GameSettings) {
    let gamesettings = gamesettings
    gamesettings.displayNavButtons = 0
}

还有一个观点:

    struct PageRender: View {
    @EnvironmentObject var settings: GameSettings
    var body: some View {

    if settings.score == 1 {

    toggleNavButtonOff(game settings: &settings)
    Text ("page 1")
    ...
    }
    }
    }

我还会有另一个名为 toggleNavButtonOn 的函数,将 displayNavButtons 再次更改为 1。

在代码的其他地方 (...) 有一个 if 语句来选择性地显示一些按钮(NavButtons)并单击这些按钮将“分数”增加或减少 1(这一切都按预期工作)。这个想法是在 displayNavButtons = 1 时显示 NavButtons。但是如果 displayNavButtons = 0,我希望它不会显示按钮。我需要根据某些标准改变 displayNavButtons。

但是,执行上述操作似乎不起作用。在视图中调用函数会出现错误:“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”和“不能将不可变值作为 inout 参数传递:‘设置’是get-only 属性”。

有人知道如何解决这个问题吗?谢谢

【问题讨论】:

  • "类型 '()' 不能符合 'View'" 将 if settings.score == 1 { 放在 Group

标签: swift swiftui


【解决方案1】:

试试这样的:

struct PageRender: View {
  @EnvironmentObject var settings: GameSettings
  
  var body: some View {
    Group {
      if settings.score == 1 {
        Text ("page 1")
      }
    }.onAppear {
      settings.toggleNavButtonOff()
    }
  }
}

class GameSettings: ObservableObject {
  @Published var score = 1
  @Published var alert = 0
  @Published var displayNavButtons = 1

  func toggleNavButtonsOff() {
    self.dispalyNavButtons = 0
  }
}

正如@aheze 在 cmets 中所避免的那样,编译器似乎不喜欢在body使用if 语句,因为如果条件为假,则不会返回任何内容。 Group 可以防止这种情况发生。

我使用 onAppear 而不是内联调用切换函数,这没有多大意义 - SwiftUI 中的视图可能会被渲染很多次次,而您通常不想这样做在声明性视图层次结构中交错命令式代码。

【讨论】:

  • 感谢您的帮助。不幸的是,这似乎不起作用。它无法访问该函数 - 当您从 PageRender 视图调用它时它无法识别它
  • 抱歉——我忘了​​在视图模型上调用它。请重试。
猜你喜欢
  • 2020-04-10
  • 2022-11-14
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多