【问题标题】:unlock content in UINavigationController解锁 UINavigationController 中的内容
【发布时间】:2026-02-19 17:35:01
【问题描述】:

我构建了一个包含IAP (In App Purchase) 的应用程序。该应用程序是使用UINavigationController 构建的。当用户决定购买内容时,解锁功能解锁内容。然后用户点击后退按钮,他们将返回主菜单,然后他们可以访问应用程序的其余部分。所有这些都可以正常工作。

我的问题是,当用户转到作为UINavigationController 一部分的解锁viewController,然后返回主菜单页面时,应用程序已经清除了用户购买解锁的事实的记忆内容和(我假设)使用在此初始主菜单viewControllerviewDidLoad 方法中设置的property.enabled = no; 属性在重新加载主页时重新锁定内容。

那么,我的问题是如何让应用知道用户已购买应用内内容,并在用户偏离主菜单页面后保持内容解锁?

我在想也许我可以在mainMenuViewController 中声明BOOL appPurchased;。然后从新解锁的viewControllers 中包含一个prepareForSegueMethod,将BOOL 设置为YES,这将反过来在if 语句中启用购买的内容。

类似这样的:

  1. mainMenuViewController.m@implementation 之后声明BOOL appPurchased;

  2. mainMenuViewController.m中实现如下方法:

(void) viewWillAppear:(BOOL)animated {
    if (appPurchased) {
        [self enableLockedContent];
    } else if (!appPurchased){
        nil;
    }    
}
  1. UnlockedContentViewController 中,实现以下连接到UIButton 的方法:
(IBAction)toMainMenu:(id)sender {
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *mainMenu = [mainStoryboard instantiateViewControllerWithIdentifier:@"cover"];
    [self.navigationController pushViewController:mainMenu animated:YES];
}

上面的(IBAction)toMainMenu:(id)sender方法我不知道怎么写MainMenuViewController.appPurchase =YES;

这种将BOOL 值发送回mainViewController 的配置是否接近工作?有没有更好的办法?

【问题讨论】:

  • 非消耗品使用恢复购买功能怎么样? *.com/questions/7761556/…
  • 我不希望用户每次返回主菜单时都必须恢复内容。我需要找到一种方法让内容始终保持解锁状态,除非设备已关闭或类似情况。

标签: ios uinavigationcontroller in-app-purchase


【解决方案1】:

您可以将 UIViewController 转换为 MainMenuViewController(然后您就可以设置 appPurchase 属性):

- (IBAction)toMainMenu:(id)sender {
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                             bundle:nil];
    MainMenuViewController *mainMenu = (MainMenuViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"cover"];
    mainMenu.appPurchase = YES;
    [self.navigationController pushViewController:mainMenu animated:YES];
}

您还可以将购买信息保存在某处(可能是 NSUserDefaults?)并让 MainMenuViewController 自行检索此信息(在 init 甚至 viewDidLoad 方法上)。

【讨论】:

  • 谢谢。我使它与我认为与您所做的类似的东西一起工作。我将 声明为 MainMenuViewController 中的 BOOL 属性而不是实例变量,然后我可以从其他 viewController 访问它prepareForSegue 方法与 我宁愿按照您的建议保留数据。我认为那会是更好、更专业的方法,但还不知道该怎么做。再次感谢
  • Bruno--我在另一个实例中使用了您的代码,其中我有一个需要与 MainMenuVC 排序并发送相同信息的 XIB 文件(appPurchased = YES;)因为我无法使用 ifIdentifierIsEqualTo 进行 egue XIB,我选择了你的版本而不是我的版本。它完美无缺!我将返回并将我的其他 ViewController 更改为您的代码,因为它更加简洁明了。一百万谢谢你的帮助!