在NSObject类中设置协议,并在UIViewController类中调用它们

问题描述:

我是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方法应该引起与会代表,但它没有发生,我没有得到什么,我在这里失踪。帮助将非常感激。

您没有保留您的InAppPurchase对象。有可能会在代理被调用之前被释放并设置为零。

尝试创建类变量var iap: InAppPurchase,然后在实例化类时分配给该变量。

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

这应该保留你的实例并允许它接收委托方法调用。

应该创建为波纹管的实例

static var shared:InAppPurchase = { 
     return InAppPurchase() 
    }()