从方法更新SwiftUI列表

时间:2020-09-27 21:18:31

标签: swift swiftui ios13

请考虑以下swiftUI方案:

const buttons = document.querySelectorAll('button');

for (const button of buttons) {
  console.log(buttons[0].value);

  button.onmouseenter = () => {
    console.log(buttons);

    const drop = document.createElement('div');
    const pe = (p) => {
      const text = document.createElement('p');
      text.innerText = p;
      drop.appendChild(text);
    }
    pe('comedy and romence');
    pe('mystrey');

    drop.style.width = '190px';
    drop.style.height = '130px';
    drop.style.display = 'grid';
    drop.style.placeItems = 'center';
    drop.style.border = '0px';
    drop.style.borderRadius = '25px';
    drop.style.backgroundColor = 'rgba(0, 200, 157, 0.2)';
    drop.style.animation = 'move 300ms ease-in-out forwards';

    button.appendChild(drop);
    button.onmouseleave = () => {
      button.removeChild(drop);
    }
  }
}

其中List { ForEach(manager.items(filter: .all), id: \.id) { item in RowView(item: item) } } 是通过manager注入的环境对象。 @EnvironmentObject var manager: Manager方法返回根据过滤器参数获取的核心数据实体的数组。这对于更改元素非常有效,但是无论何时添加或删除元素,都不会通知ForEach视图(当然,因为它是函数返回的,并且没有“绑定”等)。

这是bes实践的方法来相应地更新列表吗?我可以以某种方式包装函数调用吗?或通知更改?任何提示,不胜感激!

2 个答案:

答案 0 :(得分:0)

我不确定这与核心数据提取的行为以及表现如何有关,但是您可以尝试像这样绑定您的提取结果:

    //...

    private var items: Binding<[ItemType]> { Binding (
        get: { self.manager.items(filter: .all) },
        set: { _ in }
    )}
    
    var body: some View {
        
        List {
            ForEach(self.items, id: \.id) { item in
                RowView(item: item)
            }
        }

    //...

或者:

    List {
        ForEach(self.items.wrappedValue, id: \.id) { item in
            RowView(item: item)
        }
    }

在Swift 5.3中,可以省略对self.的引用。

答案 1 :(得分:-1)