Thread 1: Fatal error: Index out of range In SwiftUI
Thread 1: Fatal error: Index out of range In SwiftUI
我正在尝试制作一个小型社交媒体应用程序。 friends 和 friendrequest 作为 User 存储在不同的数组中。但是当我想循环数组时它显示哪个用户发送请求它首先工作但是当我接受用户并且他从数组中删除时我收到这个错误“线程 1:致命错误:索引超出范围”我知道它是因为循环想要循环到一个不再存在的索引,但我该如何修复它?
struct FriendsView: View {
@EnvironmentObject var appUser: User
var body: some View {
List {
ForEach(0..<appUser.friendAnfrage.count) {
durchlauf in
SingleFriendView(user: appUser.friendAnfrage[durchlauf])
}
}
}
}
class User: ObservableObject{
@Published var username: String = ""
@Published var name: String = ""
var password: String = ""
@Published var email: String = ""
@Published var beschreibung: String = ""
@Published var profilBild: UIImage?
@Published var friends = [User]()
@Published var friendAnfrage = [User]()
@Published var anfrageGesendet = [User]()
@Published var feed = [SinglePostView]()
func addFriend(friend: User,appUser: User) {
friend.friendAnfrage.append(appUser)
appUser.anfrageGesendet.append(friend)
}
func newFriend(newFriend: User) {
friends.append(newFriend)
for i in 0..<friendAnfrage.count {
if friendAnfrage[i].username == newFriend.username {
friendAnfrage.remove(at: i)
}
}
}
func friendAnfrage(friend: User,appUser: User) {
appUser.friendAnfrage.append(friend)
}
func makePost(image: UIImage,appUser: User) {
feed.append(SinglePostView(bild: image, ersteller: appUser))
for i in 0..<friends.count {
friends[i].feed.append(SinglePostView(bild: image, ersteller: appUser))
}
}
}
使用 index-based 方法的 ForEach
在 SwiftUI 中是危险的。相反,让您的模型可识别。
class User: ObservableObject, Identifiable {
var id = UUID()
//...
然后,改变你的循环:
ForEach(appUser.friendAnfrage) { item in
SingleFriendView(user: item)
}
与这个问题无关,但通常 SwiftUI 使用 struct
作为模型比 class
效果更好。如果 friends
中的 User
使用您当前的代码更新,因为它是嵌套的 ObservableObject
,您的 View
将不会自动更新。
User
应该是一个结构,ForEach
不是传统的循环,它是一个必须提供可识别数据的视图,例如
struct FriendsView: View {
@EnvironmentObject var model: Model
var body: some View {
List {
ForEach($model.users) { $user in
SingleFriendView(user: $user)
}
}
}
}
struct User: Identifiable{
let id = UUID()
var username: String = ""
var friends: [UUID] = []
}
class Model: ObservableObject {
@Published var users: [User] = []
}
我正在尝试制作一个小型社交媒体应用程序。 friends 和 friendrequest 作为 User 存储在不同的数组中。但是当我想循环数组时它显示哪个用户发送请求它首先工作但是当我接受用户并且他从数组中删除时我收到这个错误“线程 1:致命错误:索引超出范围”我知道它是因为循环想要循环到一个不再存在的索引,但我该如何修复它?
struct FriendsView: View {
@EnvironmentObject var appUser: User
var body: some View {
List {
ForEach(0..<appUser.friendAnfrage.count) {
durchlauf in
SingleFriendView(user: appUser.friendAnfrage[durchlauf])
}
}
}
}
class User: ObservableObject{
@Published var username: String = ""
@Published var name: String = ""
var password: String = ""
@Published var email: String = ""
@Published var beschreibung: String = ""
@Published var profilBild: UIImage?
@Published var friends = [User]()
@Published var friendAnfrage = [User]()
@Published var anfrageGesendet = [User]()
@Published var feed = [SinglePostView]()
func addFriend(friend: User,appUser: User) {
friend.friendAnfrage.append(appUser)
appUser.anfrageGesendet.append(friend)
}
func newFriend(newFriend: User) {
friends.append(newFriend)
for i in 0..<friendAnfrage.count {
if friendAnfrage[i].username == newFriend.username {
friendAnfrage.remove(at: i)
}
}
}
func friendAnfrage(friend: User,appUser: User) {
appUser.friendAnfrage.append(friend)
}
func makePost(image: UIImage,appUser: User) {
feed.append(SinglePostView(bild: image, ersteller: appUser))
for i in 0..<friends.count {
friends[i].feed.append(SinglePostView(bild: image, ersteller: appUser))
}
}
}
ForEach
在 SwiftUI 中是危险的。相反,让您的模型可识别。
class User: ObservableObject, Identifiable {
var id = UUID()
//...
然后,改变你的循环:
ForEach(appUser.friendAnfrage) { item in
SingleFriendView(user: item)
}
与这个问题无关,但通常 SwiftUI 使用 struct
作为模型比 class
效果更好。如果 friends
中的 User
使用您当前的代码更新,因为它是嵌套的 ObservableObject
,您的 View
将不会自动更新。
User
应该是一个结构,ForEach
不是传统的循环,它是一个必须提供可识别数据的视图,例如
struct FriendsView: View {
@EnvironmentObject var model: Model
var body: some View {
List {
ForEach($model.users) { $user in
SingleFriendView(user: $user)
}
}
}
}
struct User: Identifiable{
let id = UUID()
var username: String = ""
var friends: [UUID] = []
}
class Model: ObservableObject {
@Published var users: [User] = []
}