2013-10-09 27 views
2

我已经为SKStoreProductViewController实现了一个委托。 我将视图控制器添加到按键窗口的视图控制器中。 我也在代理函数中实现了一个dismiss view controller代码。SKStoreProductViewController取消按钮崩溃或不工作

这个问题似乎是在这个问题上的答案。
Modal App Store won't dismiss
然而,这个问题仍然存在于我的情况中。

显示功能

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { 
    NSString *appURL = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/%@/app/id%@", 
         [[NSLocale preferredLanguages] objectAtIndex:0], applicationID]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:appURL]]; 

} else { 
    NSDictionary* dict = [NSDictionary dictionaryWithObject:applicationID forKey:SKStoreProductParameterITunesItemIdentifier]; 
    SKStoreProductViewController *viewCont = [[SKStoreProductViewController alloc] init]; 
    viewCont.delegate = self; 
    [viewCont loadProductWithParameters:dict completionBlock:^(BOOL result, NSError *error) 
    { 
     UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController; 
     if (viewController) 
     { [viewController presentViewController:viewCont animated:YES completion:nil]; } 
    }]; 
} 

委托功能

- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController 
{ 
    if (viewController) 
    { [viewController dismissViewControllerAnimated:YES completion:nil]; } 
} 

回答

0

请尝试委托功能,以取代所有行:

[self dismissViewControllerAnimated:YES completion:nil]; 
+0

自身不是视图控制器 –

+0

SKStoreProductViewController中的取消按钮或...? – McLand

+0

SKStoreProductViewController中的Cancel按钮。但是这个类不是视图控制器。父视图是关键窗口的视图控制器。 –

0

如果这段代码驻留?您将委托设置为编写此代码的实例,但您将SKStoreProductViewController添加到根视图。
您是否尝试将商店添加到自我?

[self presentViewController:storeController animated:YES completion:nil]; 

感谢您的委托功能。这在文档中并不明显。

6

的问题是,你必须实现

- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController 
{ 
    if (viewController) 
    { [self dismissViewControllerAnimated:YES completion:nil]; } 
} 

委托类里面。如果您在代理正在呈现SKStoreProductViewController的班级内部实施它,则它将不起作用,因为SKStoreProductViewController会尝试在其委托中调用productViewControllerDidFinish:,该委托不实施该方法。

让我给个例子:

@implementation MainViewController 

- (void)presentSecondViewController 
{ 
    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
    [secondViewController setDelegate:self]; 
    [self presentViewController:secondViewController animated:YES completion:nil]; 
} 

- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController 
{ 
    if (viewController) 
    { [self dismissViewControllerAnimated:YES completion:nil]; } 
} 

@end 


@implementation SecondViewController { 
    id delegate <SKStoreProductViewControllerDelegate>; 
} 

- (void)setDelegate:(id)delegate 
{ 
    _delegate = delegate; 
} 

- (void)callStoreProductViewController 
{ 
    SKStoreProductViewController *viewCont = [[SKStoreProductViewController alloc] init]; 
    viewCont.delegate = _delegate; 
    [viewCont loadProductWithParameters:dict completionBlock:^(BOOL result, NSError *error) 
    { 
     UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController; 
     if (viewController) 
      { [_delegate presentViewController:viewCont animated:YES completion:nil]; } 
    }]; 
} 
@end 

所以,如果我没有理解你的问题很好,你必须实现productViewControllerDidFinish:viewController类中,因为它是谁在presentig的SKStoreProductViewController之一。

希望这会有所帮助!