【问题标题】:List of custom Class , update view in swift自定义类列表,快速更新视图
【发布时间】:2021-07-05 20:11:33
【问题描述】:

我是 Swift 新手,很抱歉这个基本问题。

我创建了一个自定义类,我想在 SwiftUI 中显示这个自定义类的列表。我想跟踪此列表中的更改(新元素,删除元素)。我无法更改类的性质,但我可以创建或不创建自定义类,该类的实例列表。

import SwiftUI

public class User: NSObject,Codable,ObservableObject {
    var username : String
    
    public override init() {
        self.username = "VOID"
    }
    public func setUsername(username:String){
        self.username=username
    }
}

var uad1:User = .init()
var uad2:User = .init()

var listUR: [User] = []

struct listM: View {
    init() {
        uad1.setUsername(username: "user1")
        listUR.append(uad1)
        
    }
    
    var body: some View {
        
        LazyVStack {
            ForEach(listUR.indices) { i in
                Text(verbatim: listUR[i].username)
                    .onTapGesture {
                        addElement()
                    }
                    .onAppear(){
                        print(i)
                    }
            }
        }
    }
    private func addElement(){
        uad2.setUsername(username: "user2")
        listUR.append(uad2)
        
    }
}

如果我使用@State 对象作为列表,则不会显示任何内容。作为列表,点击手势时显示第一个元素,但不显示第二个元素。尝试使用 Observed 对象但不能循环 ForEach。请注意,我需要 i 索引。

【问题讨论】:

  • 试试Apple SwiftUI Tutorials 所有这些都是非常基本的东西
  • 谢谢你,但在询问之前我搜索了但找不到足够相似的东西,我可以适应它
  • User 是否需要是一个类 - 它可以是一个结构吗?

标签: swift list class swiftui


【解决方案1】:

您的用户Array 必须是@State 中的View

class User: ObservableObject, Identifiable {
  var id: UUID = UUID()
  var name: String

  init(name: String) {
    self.name = name
  }
}

struct ContentView: View {
  @State var users: [User] = [User(name: "VOID"), User(name: "VOID")]

  var body: some View {
    List {
      ForEach(users) { user in
        HStack { // <-- Use an HStack and add a Spacer so the cell goes to the edge
          Text(user.name)
          Spacer()
        }
        .contentShape(Rectangle()) // <-- Add a contentShape so the whole cell is tappable
        .onTapGesture {
          addUser()
        }
      }
    }
  }

  private func addUser() {
    users.append(User(name: "user\(users.count + 1)"))
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多