如何在通过 modalView 进行应用内购买后重新加载数据
How to reloadData after an in app purchase through modalView
我查看了不同的来源来找到这个问题的答案,并且可能尝试了几种方法来 reloadData() 但到目前为止没有成功。
这是我的案例:
我有一个 tabBar,我在其中显示 tableView 中的内容。当您进入该选项卡时,如果您尚未购买内容,我会显示一个模态视图。
假设您已经购买了内容。模态视图自行消失,但 tableview 不会显示任何内容,除非您终止该应用程序并再次重新 运行。当您这样做时,tableView 会重新加载内容。没问题。但这肯定是有问题的,我确实因此失去了用户。
我确实使用这样的密钥跟踪购买情况:
private var hiddenStatus: Bool = UserDefaults.standard.bool(forKey:"purchaseStatus")
我在成功购买时将其设置为 true,如下所示:
self.setNonConsumablePurchase(true)
最后是我检查购买时密钥是否设置为 "true" 的代码。我在 viewDidLoad 上调用它,但它没有意义,因为当用户触摸此 tabBar 项目时它已经被调用。
if hiddenStatus == true {
DispatchQueue.main.async(execute: {
self.segmentioView.valueDidChange = { [weak self] _, segmentIndex in
switch self?.segmentioView.selectedSegmentioIndex {
case 0:
self?.observeAugustProducts()
self?.tableView.reloadData()
case 1:
self?.observeSeptemberProducts()
self?.tableView.reloadData()
default:
self?.tableView.reloadData()
}
}
})
}
所以我在寻找两件事:
1- 保持一切原样并调整代码以使其正常工作。
2- 为用户提供更好的应用内购买体验的替代想法(我曾经使用 UIAlertViewController 进行应用内购买,但决定不使用它)
我推荐使用这个扩展:
extension NotificationCenter {
func setUniqueObserver(_ observer: AnyObject, selector: Selector, name: NSNotification.Name, object: AnyObject?) {
NotificationCenter.default.removeObserver(observer, name: name, object: object)
NotificationCenter.default.addObserver(observer, selector: selector, name: name, object: object)
}
}
在关闭模态视图之前,让模态视图的 ViewController post 收到通知。
类似于:
NotificationCenter.default.post(name: "Purchased", object: nil)
然后让您的 TableView 的 ViewController 注册以监听该通知(在 viewWillAppear 中)- 并处理它。
类似于:
NotificationCenter.default.setUniqueObserver(self, selector: #selector(handlePurchased), name: "Purchased", object: nil)
和
@objc func handlePurchased() {
// Reload your TableView, etc.
}
希望这对某人有所帮助!
我查看了不同的来源来找到这个问题的答案,并且可能尝试了几种方法来 reloadData() 但到目前为止没有成功。
这是我的案例:
我有一个 tabBar,我在其中显示 tableView 中的内容。当您进入该选项卡时,如果您尚未购买内容,我会显示一个模态视图。
我确实使用这样的密钥跟踪购买情况:
private var hiddenStatus: Bool = UserDefaults.standard.bool(forKey:"purchaseStatus")
我在成功购买时将其设置为 true,如下所示:
self.setNonConsumablePurchase(true)
最后是我检查购买时密钥是否设置为 "true" 的代码。我在 viewDidLoad 上调用它,但它没有意义,因为当用户触摸此 tabBar 项目时它已经被调用。
if hiddenStatus == true {
DispatchQueue.main.async(execute: {
self.segmentioView.valueDidChange = { [weak self] _, segmentIndex in
switch self?.segmentioView.selectedSegmentioIndex {
case 0:
self?.observeAugustProducts()
self?.tableView.reloadData()
case 1:
self?.observeSeptemberProducts()
self?.tableView.reloadData()
default:
self?.tableView.reloadData()
}
}
})
}
所以我在寻找两件事:
1- 保持一切原样并调整代码以使其正常工作。
2- 为用户提供更好的应用内购买体验的替代想法(我曾经使用 UIAlertViewController 进行应用内购买,但决定不使用它)
我推荐使用这个扩展:
extension NotificationCenter {
func setUniqueObserver(_ observer: AnyObject, selector: Selector, name: NSNotification.Name, object: AnyObject?) {
NotificationCenter.default.removeObserver(observer, name: name, object: object)
NotificationCenter.default.addObserver(observer, selector: selector, name: name, object: object)
}
}
在关闭模态视图之前,让模态视图的 ViewController post 收到通知。
类似于:
NotificationCenter.default.post(name: "Purchased", object: nil)
然后让您的 TableView 的 ViewController 注册以监听该通知(在 viewWillAppear 中)- 并处理它。
类似于:
NotificationCenter.default.setUniqueObserver(self, selector: #selector(handlePurchased), name: "Purchased", object: nil)
和
@objc func handlePurchased() {
// Reload your TableView, etc.
}
希望这对某人有所帮助!