gpt4 book ai didi

ios - SwiftUI 列表仅使用给定数组的第一项

转载 作者:行者123 更新时间:2023-12-02 19:38:58 25 4
gpt4 key购买 nike

我在下面有一个简单的 View 来显示用户的所有联系人:

struct AllContactsView: View {
static let withState: some View = AllContactsView().environmentObject(AllContactsProvider())
@EnvironmentObject var contactsProvider: AllContactsProvider
let title: UserListType = .selectInvitees

var body: some View {
List(self.contactsProvider.invitees) { invite in
self.row(for: invite)
}
.navigationBarTitle(Text(self.title.rawValue))
.onAppear(perform: self.contactsProvider.fetch)
}

func row(for invite: Invitee) -> some View {
// everything below is only printed out once!
print(self.contactsProvider.invitees.prettyPrinted) // shows correct array of contacts
print(type(of: self.contactsProvider.invitees)) // this is indeed an array
print(invite) // prints out the first item in the array (which is expected on first pass)
return UserRow(invitee: invite)
}
}

我正在操作 CNContacts 的数组,我得到这样一个被邀请者数组,这是我试图在我的列表中显示的内容:

self?.invitees = contacts.asSimpleContacts.map({ $0.asUser.asInvitee })

使用下面的支持功能和扩展:

// Contact Value simplified so we can pass it around as a value type.
public struct SimpleContact: Hashable, Codable {
let firstName: String
let lastName: String
let emails: [String]
let phoneNumbers: [PhoneNumber]

var fullName: String { "\(self.firstName) \(self.lastName)" }

var asUser: User {
User(
id: Constants.unsavedID,
username: self.fullName,
picURL: "al",
email: self.emails.first ?? "",
phone: self.phoneNumbers.first ?? "",
created: Date().timeIntervalSince1970
)
}
}


extension CNContact {
/// Returns the `SimpleContact` representation of `self`
var asSimpleContact: SimpleContact {
SimpleContact(
firstName: self.givenName,
lastName: self.familyName,
emails: self.emailAddresses.map({ String($0.value) }),
phoneNumbers: self.phoneNumbers.map({ Authentication.sanitize(phoneNo: $0.value.stringValue) })
)
}
}

extension Array where Element == CNContact {
/// Returns the `SimpleContact` mapping of `self`
var asSimpleContacts: [SimpleContact] { self.map({ $0.asSimpleContact }) }
}

public struct User: Hashable, Codable, Identifiable {
public let id: String
let username: String
let picURL: String
let email: String
let phone: String
let created: Double

var asInvitee: Invitee { Invitee(user: self, isGoing: false) }
}

按照 self.contactsProvider.fetch() 的预期,联系人将填充到 self.contactsProvider.invitees 中。但是,SwiftUI 显示的是 self.contactsProvider.invitees.countself.contactsProvider.invitees.first 实例,而不是每个联系人。我将下面的方法与其他在线示例进行了比较,但似乎无法找到我出错的地方。我确定问题出在联系人操作上 - 当我提供一组模拟的受邀者时,一切都按预期工作,尽管在没有模拟的情况下按预期编译和运行,并且打印和调试没有显示任何内容。

如有任何帮助,我们将不胜感激。

最佳答案

我刚遇到这个问题,回答得更清楚一点:

SwiftUI 列表中的每一行都应使用唯一 ID 生成。

如果您使用 List() 函数创建 View ,请确保您指定了一个 id

struct MenuView: View {
var body: some View {
VStack {
Section(header: MenuSectionHeader()) {
//item.sku is the unique identifier for the row
List(Menu.allItems, id:\.sku) { item in
MenuItemRow(item)
}
}
}
}

关于ios - SwiftUI 列表仅使用给定数组的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60581714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com