2017-01-11 10 views
0

SwiftyStoreKitが提示するalertViewではなく、私のラベルの中にSKProductアイテムの価格を表示したいと思います。 viewDidLoadでUILabel(Swift)(SwiftyStoreKit)に現在の関数の結果

、Iは

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) 
    } 
} 

すべてのヘルプは、ここでの主な問題は、あなたがあなたの関数getInfoが暗黙的UILabelString?プロパティに戻りますVoid(別名())値を代入しようとしているということです

答えて

1

を高く評価しています。それはうまくいかないでしょう。

getInfoから必要な情報を簡単に返すことができないのは、非同期呼び出しを行うためです。あなたがviewDidLoadであなたのSKProducterrorMessageを持って

ここ
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) 
    } 
} 

:あなたが必要なものを達成するための一つの方法は再ファクタビット(構文エラーをチェック、それほど警戒するしませんでした)次のようにコードです完成のクロージャでは、あなたはそれを望むものを自由に行うことができます:ショーアラート、ラベルの更新など。そして全体的にこのコードは少し柔軟性があり、通常は良いことですが、デカップリングする必要があります)

+0

Swift 3が必要としたことを反映するためにコードにいくつかの変更を加えました。また、私は価格が必要なだけで検索したデータを変更しました。 –

+0

すばらしい。ありがとうございました。 –

関連する問題