2013-10-09 32 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之一。

希望這會有所幫助!