我希望在我的标签中显示SKProduct项目的价格,而不是alertView,就像SwiftyStoreKit显示的那样。
在viewDidLoad里,我试过
coralsAppLabel.text = getInfo(PurchaseCorals)但这会导致错误,无法将类型()转换为UILabel。
这是基于下面的SwiftyStoreKit代码。
enum RegisteredPurchase : String {
case reefLifeCorals = "ReefLife4Corals"
}
@IBOutlet weak var coralsAppLabel: UILabel!
func getInfo(_ purchase: RegisteredPurchase) {
NetworkActivityIndicatorManager.networkOperationStarted()
SwiftyStoreKit.retrieveProductsInfo([purchase.rawValue]) { result in
NetworkActivityIndicatorManager.networkOperationFinished()
self.showAlert(self.alertForProductRetrievalInfo(result))
}
}
func alertForProductRetrievalInfo(_ result: RetrieveResults) -> UIAlertController {
if let product = result.retrievedProducts.first {
let priceString = product.localizedPrice!
return alertWithTitle(product.localizedTitle, message: "\(product.localizedDescription) - \(priceString)")
}
else if let invalidProductId = result.invalidProductIDs.first {
return alertWithTitle("Could not retrieve product info", message: "Invalid product identifier: \(invalidProductId)")
}
else {
let errorString = result.error?.localizedDescription ?? "Unknown error. Please contact support"
return alertWithTitle("Could not retrieve product info", message: errorString)
}
}任何帮助都是非常感谢的。
发布于 2017-01-11 11:30:18
这里的主要问题是,您试图将函数Void (又名())的值隐式地分配给UILabel的String?属性。那是行不通的。
您也不能轻松地从getInfo函数返回所需的信息,因为它执行异步调用。完成所需任务的一种方法是对代码进行重新分解,如下所示(没有检查语法错误,所以要小心):
override func viewDidLoad() {
super.viewDidLoad()
getProductInfoFor(PurchaseCorals, completion: { [weak self] (product, errorMessage) in
guard let product = product else {
self?.coralsAppLabel.text = errorMessage
return
}
let priceString = product.localizedPrice!
self?.coralsAppLabel.text = "\(product.localizedDescription) - \(priceString)"
})
}
func getProductInfoFor(_ purchase: RegisteredPurchase, completion: (product: SKProduct?, errorMessage: String?) -> Void) {
NetworkActivityIndicatorManager.networkOperationStarted()
SwiftyStoreKit.retrieveProductsInfo([purchase.rawValue]) { result in
NetworkActivityIndicatorManager.networkOperationFinished()
let extractedProduct = self.extractProductFromResults(result)
completion(product: extractedProduct.product, errorMessage: extractedProduct.errorMessage)
}
}
func extractProductFromResults(_ result: RetrieveResults) -> (product: SKProduct?, errorMessage: String?) {
if let product = result.retrievedProducts.first {
return (product: product, errorMessage: nil)
}
else if let invalidProductId = result.invalidProductIDs.first {
return (product: nil, errorMessage: "Invalid product identifier: \(invalidProductId)")
}
else {
let errorString = result.error?.localizedDescription ?? "Unknown error. Please contact support"
return (product: nil, errorMessage: errorString)
}
}在这里,您可以在完成闭包中使用SKProduct或errorMessage,您可以随意使用它:显示警报、更新标签等。总的来说,这段代码应该更灵活一些,并且可以解耦--这通常是一件好事;)
https://stackoverflow.com/questions/41588678
复制相似问题