SwiftUI - Return 从函数到视图的图像
SwiftUI - Return image from function to view
我有一个功能,可以在我传入地点 ID 后从 Google 个地点抓取商家的图像。我能够 'print' 照片并从我编写的函数中看到实际照片,我只是不确定如何 return 该图像以便我可以将它放在视图中。我的想法是,我可以 return 函数中的图像并用它替换视图中的 'placeHolderImage'。
代码如下:
struct RestaurantDetail: View {
var name: String
var placeID: String
var address: String
var city: String
var state: String
var zipCode: String
var phone: String
var about: String
var website: String
var inputLat: Double
var inputLong: Double
var foodType: String
var fileURL: String
@State var placeHolderImage = Image(systemName: "flag.fill")
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
VStack {
placeHolderImage
.resizable()
.aspectRatio(contentMode: .fill)
.frame(height: 150)
.clipped()
.padding(.bottom)
VStack {
HStack {
Text("About")
.font(.title)
.fontWeight(.bold)
Spacer()
}.padding(.horizontal)
.padding(.vertical, 10)
HStack {
Text(about)
.font(.footnote)
Spacer()
}.padding(.horizontal)
.padding(.bottom, 40)
HStack {
Text("Location")
.font(.title)
.fontWeight(.bold)
Spacer()
}.padding(.horizontal)
MapLocation(inputLat: inputLat, inputLong: inputLong, inputTitle: name, inputFoodType: foodType)
.frame(height: 160)
HStack {
Text(name)
.font(.system(size: 20))
.fontWeight(.semibold)
}.padding(.vertical, 10)
HStack {
Text(address) + Text(", ") + Text(city) + Text(", ") + Text(state) + Text(" ") + Text(zipCode)
}.font(.system(size: 13))
}
}
}.onAppear {
self.getPhotos(placesID: self.placeID)
}
}
func getPhotos(placesID: String) -> (UIImage) {
let client = GMSPlacesClient()
print("getPhotos function ran")
client.lookUpPhotos(forPlaceID: placeID) { (metadatalist, err) in
if let err = err {
print("error when looking up photos:", err)
return
}
// print(metadatalist)
guard let firstPhotoMetadata = metadatalist?.results.first else { return }
client.loadPlacePhoto(firstPhotoMetadata) { (image, err) in
if let err = err {
print("Failed to load photo for place:", err)
return
}
guard let placeImage = image else { return }
print(placeImage)
return placeImage
}
}
}
}
尝试以下操作,如果API设置正确,它应该可以工作
func getPhotos(placesID: String) { // async, so no return needed
let client = GMSPlacesClient()
print("getPhotos function ran")
client.lookUpPhotos(forPlaceID: placeID) { (metadatalist, err) in
if let err = err {
print("error when looking up photos:", err)
return
}
// print(metadatalist)
guard let firstPhotoMetadata = metadatalist?.results.first else { return }
client.loadPlacePhoto(firstPhotoMetadata) { (image, err) in
if let err = err {
print("Failed to load photo for place:", err)
return
}
guard let placeImage = image else { return }
print(placeImage)
DispatchQueue.main.async { // state must be updated in main queue
self.placeHolderImage = Image(uiImage: placeImage)
}
}
}
}
我有一个功能,可以在我传入地点 ID 后从 Google 个地点抓取商家的图像。我能够 'print' 照片并从我编写的函数中看到实际照片,我只是不确定如何 return 该图像以便我可以将它放在视图中。我的想法是,我可以 return 函数中的图像并用它替换视图中的 'placeHolderImage'。
代码如下:
struct RestaurantDetail: View {
var name: String
var placeID: String
var address: String
var city: String
var state: String
var zipCode: String
var phone: String
var about: String
var website: String
var inputLat: Double
var inputLong: Double
var foodType: String
var fileURL: String
@State var placeHolderImage = Image(systemName: "flag.fill")
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
VStack {
placeHolderImage
.resizable()
.aspectRatio(contentMode: .fill)
.frame(height: 150)
.clipped()
.padding(.bottom)
VStack {
HStack {
Text("About")
.font(.title)
.fontWeight(.bold)
Spacer()
}.padding(.horizontal)
.padding(.vertical, 10)
HStack {
Text(about)
.font(.footnote)
Spacer()
}.padding(.horizontal)
.padding(.bottom, 40)
HStack {
Text("Location")
.font(.title)
.fontWeight(.bold)
Spacer()
}.padding(.horizontal)
MapLocation(inputLat: inputLat, inputLong: inputLong, inputTitle: name, inputFoodType: foodType)
.frame(height: 160)
HStack {
Text(name)
.font(.system(size: 20))
.fontWeight(.semibold)
}.padding(.vertical, 10)
HStack {
Text(address) + Text(", ") + Text(city) + Text(", ") + Text(state) + Text(" ") + Text(zipCode)
}.font(.system(size: 13))
}
}
}.onAppear {
self.getPhotos(placesID: self.placeID)
}
}
func getPhotos(placesID: String) -> (UIImage) {
let client = GMSPlacesClient()
print("getPhotos function ran")
client.lookUpPhotos(forPlaceID: placeID) { (metadatalist, err) in
if let err = err {
print("error when looking up photos:", err)
return
}
// print(metadatalist)
guard let firstPhotoMetadata = metadatalist?.results.first else { return }
client.loadPlacePhoto(firstPhotoMetadata) { (image, err) in
if let err = err {
print("Failed to load photo for place:", err)
return
}
guard let placeImage = image else { return }
print(placeImage)
return placeImage
}
}
}
}
尝试以下操作,如果API设置正确,它应该可以工作
func getPhotos(placesID: String) { // async, so no return needed
let client = GMSPlacesClient()
print("getPhotos function ran")
client.lookUpPhotos(forPlaceID: placeID) { (metadatalist, err) in
if let err = err {
print("error when looking up photos:", err)
return
}
// print(metadatalist)
guard let firstPhotoMetadata = metadatalist?.results.first else { return }
client.loadPlacePhoto(firstPhotoMetadata) { (image, err) in
if let err = err {
print("Failed to load photo for place:", err)
return
}
guard let placeImage = image else { return }
print(placeImage)
DispatchQueue.main.async { // state must be updated in main queue
self.placeHolderImage = Image(uiImage: placeImage)
}
}
}
}