2017-07-19 31 views
0

我是swift的新手,我只是想知道是否有辦法在NSObject類中聲明一些委託協議並在UIViewController類中調用它們。我試過這樣做,它會導致運行時異常。我的代碼在下面的類中。在NSObject類中設置協議,並在UIViewController類中調用它們

NSObject類

import UIKit 
import StoreKit 
class InAppPurchase: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver { 
var productsList = [SKProduct]() 
    var productToPurchase = SKProduct() 
    var productID = "" 
    let PURCHASE_ID_PREFIX = "com.aux.ApplePaySample." 


    public func initPayment (productID: String) { 
     self.productID = PURCHASE_ID_PREFIX + productID 
     print("Initializing Purchase Product ID: \(self.productID)") 
     if SKPaymentQueue.canMakePayments() { 
      let productID: NSSet = NSSet(objects: self.productID) 
      let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>) 
      request.delegate = self 
      request.start() 
     }else { 
      print("In App Purchases not enabled") 
     } 
    } 

    func buyProduct() { 
     let payment = SKPayment(product: productToPurchase) 
     SKPaymentQueue.default().add(self) 
     SKPaymentQueue.default().add(payment as SKPayment) 
    } 


    public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 
     let myProducts = response.products 
     for product in myProducts { 
      print("\(product.productIdentifier) \(product.price) \(product.localizedDescription)") 
      productsList.append(product) 
     } 

     for product in productsList { 
      let productID = product.productIdentifier 
      if productID == self.productID { 
       productToPurchase = product 
       buyProduct() 
      } 
     } 

    } 
} 

UIViewController類

import UIKit 
import StoreKit 

class InAppViewController: UIViewController{ 
    @IBOutlet var buyButton: UIButton! 
    // SKProductsRequestDelegate, SKPaymentTransactionObserver 
    let defaults = UserDefaults.standard 
    var product_id: NSString? 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    InAppPurchase().initPayment(productID: "101") 
} 

技術上我initPayment方法應該引起與會代表,但它沒有發生,我沒有得到什麼,我在這裏失蹤。幫助將非常感激。

回答

0

您沒有保留您的InAppPurchase對象。有可能會在代理被調用之前被釋放並設置爲零。

嘗試創建類變量var iap: InAppPurchase,然後在實例化類時分配給該變量。

iap = InAppPurchase() 
iap.initPayment(productID: "101") 

這應該保留你的實例並允許它接收委託方法調用。

0

應該創建爲波紋管的實例

static var shared:InAppPurchase = { 
     return InAppPurchase() 
    }() 
相關問題