如何从其主体中更新视图的复杂模型

时间:2020-01-04 04:35:54

标签: state swiftui

我正在使用大型复杂模型构建自定义View结构,该模型要从var body : some View { ... }属性中进行更新(例如,点击表示视图中表列的按钮应更改的排序顺序)表中的行)。我不允许在body内修改此模型,因为self是不可变的:

struct MyTable : View {

  struct Configuration {
     // a LOT of data here, ie header, rows, footer, style, etc

     mutating func update() { ... } // this method must be called before view render
  }
  var configuration : Configuration

  var body : some View {
    // build the view here based on configuration
    self.configuration.columns[3].sortAscending = false // error, `self` is immutable
    self.configuration.update() // error, `self` is immutable
  }
}

我真的不想为所有配置数据创建@State变量,因为1)有很多配置数据,2)以这种方式对模型建模很困难。

我尝试将configuration设置为@State变量,但是即使代码可以编译并运行,我也无法在init()时设置配置对象! (顺便说一句,configuration var现在需要在初始化之前进行初始化,否则我会在self.configuration = c行上得到一个错误,指出在初始化所有成员之前使用了self –这很可能是使用@State(这是属性包装器)带来的麻烦。)

struct MyTable : View {

  struct Configuration {
     ...
  }

  @State var configuration : Configuration = Configuration() // must initialize the @State var

  init(configuration c: Configuration) {
    self.configuration = c // does not assign `c` to `configuration` !!!
    self.$configuration.wrappedValue = c // this also does not assign !!!
    self.configuration.update()
  }

  var body : some View {
    // build the view here based on configuration
    self.configuration.columns[3].sortAscending = false // ok, no error now about mutating a @State var
    self.configuration.update() // ok, no error
  }
}

1 个答案:

答案 0 :(得分:0)

通过在update()中创建自定义MyTable.init()并调用{{1 }}。这样,init()中的Configuration是不必要的,这种方法可以解决以前遇到的所有问题:

update()

然后在我的呼叫代码中:

init()