Вот мое мнение:
struct EditProfile: View {
@State var bio = UserDefaults.standard.string(forKey: "bio") ?? "Edit your bio"
@ObservedObject var storage = FirebaseStorage()
@State var text = ""
let photos = ["img1", "img2", "img3"]
var body: some View {
VStack {
Text("Photos")
.font(Font.system(size: 21))
.fontWeight(.bold)
HStack {
ForEach(photos, id: \.self){ img in
EditableCircleImage(kfImage: self.storage.makeCircleImage(str: img))
}
}
.background(
RoundedRectangle(cornerRadius: 10)
.fill(Color.white)
.shadow(color: .gray, radius: 1, x: 0, y: 1)
)
Text("Bio")
.font(Font.system(size: 21))
.fontWeight(.bold)
MultiTextField(txt: $text)
.padding(10)
.cornerRadius(20.0)
.background(
RoundedRectangle(cornerRadius: 10)
.fill(Color.white)
.shadow(color: .gray, radius: 1, x: 0, y: 1)
)
.border(Color.gray.opacity(0.5), width: 1)
}.padding(20).background(Color.gray.opacity(0.1))
}
}
Вот EditableCircleImage()
:
struct EditableCircleImage: View {
let kfImage: KFImage
var body: some View {
ZStack {
kfImage
.resizable()
.scaledToFit()
.frame(height: 200)
.clipShape(Circle())
.overlay(Circle().stroke(Color.orange, lineWidth: 2))
Button(action: {}){
Image(systemName: "pencil.circle.fill")
.resizable()
.scaledToFit()
.frame(height: 40)
.foregroundColor(.gray)
}.offset(x: 40, y: 50)
}
}
}
Вот модель, которая возвращает изображение: FirebaseStorage.swift
:
class FirebaseStorage: ObservableObject {
let storage = Storage.storage()
let uid = UserAuth().uid ?? "<uid>"
@Published var img1 = UserDefaults.standard.string(forKey: "img1") ?? "<img1>"
func makeCircleImage(str: String) -> KFImage {
if let url = UserDefaults.standard.string(forKey: str) {
print("not nil: \(str)")
return KFImage(URL(string: "http://app-23c8s.appspot.com.storage.googleapis.com/users/\(uid)/\(url)"))
}
else {
print("is nil: \(str)")
return KFImage(source: nil)
}
}
}
Операторы печати в модели выше печатаются снова и снова, даже если никакие значения не изменились после первоначального рендеринга. Есть идеи, почему?
Постоянно печатает:
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
not nil: img1
is nil: img2
is nil: img3
ОБНОВЛЕНИЕ:
Я изменил:
ForEach(photos, id: \.self){ img in
EditableCircleImage(kfImage: self.storage.makeCircleImage(str: img))
}
на
EditableCircleImage(kfImage: self.storage.makeCircleImage(str: "img1"))
и теперь печатает:
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1
not nil: img1