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