0

アプリ内購入を使用するアプリケーションがあります。メイン ビュー コントローラーのボタンをクリックすると、購入の復元、製品の購入、キャンセルを含む 2 番目のビュー コントローラーが読み込まれます。ビューを却下するデリゲート プロトコルがあります。キャンセルをクリックすると正常に機能しますが、ストアオブザーバーメソッドのいずれかでプログラムで却下を設定すると機能しません。NSNotification を介して動作しているように見えますが、動作しない理由を知りたいです。また、そこからボタンのアルファ値を変更しようとしても機能しません。前もって感謝します。

Appdelegate.h

#import <UIKit/UIKit.h>
#import "StoreNavigationController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic)  StoreNavigationController* observer;
@end

Appdelegate.m

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize observer;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    observer = [[StoreNavigationController alloc] init];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
    return YES;
}

ViewController.h

#import <UIKit/UIKit.h>
#import "storeNavigationController.h"

@class completeView;
@interface ViewController : UIViewController <StoreNavigationControllerDelegate>
- (void)storeNavigationControllerDidFinish;
@end

ViewController.m

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
 if ([[segue identifier] isEqualToString:@"storeView"]) {
 [[segue destinationViewController] setDelegate:self];

     }
 }

- (void)storeNavigationControllerDidFinish
{
    [self updateView];
    [self dismissModalViewControllerAnimated:YES];
}
//There is also a method in this file launching [self performSegueWithIdentifier:@"storeView" sender:self];

storeNavigationController.h

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
#import "plistController.h"

@protocol StoreNavigationControllerDelegate <NSObject>
- (void)storeNavigationControllerDidFinish; //View dismisser
@end

@class StoreNavigationController;
@interface StoreNavigationController : UIViewController <SKPaymentTransactionObserver>
@property (strong, nonatomic) id <StoreNavigationControllerDelegate> delegate;
//User actions
- (IBAction)restoreItems:(UIButton *)sender;
- (IBAction)buyItem:(UIButton *)sender;
- (IBAction)cancelPurchase:(UIButton *)sender;

//Methods SKPaymentTransactionObserver 
- (void) completeTransaction:(SKPaymentTransaction *)transaction;
- (void) failedTransaction:  (SKPaymentTransaction *)transaction;
- (void) restoreTransaction: (SKPaymentTransaction *)transaction;
- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
@end

storeNavigationController.m

- (IBAction)cancelPurchase:(UIButton *)sender {
[self.delegate storeNavigationControllerDidFinish]; //this one works ok
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                [self.delegate storeNavigationControllerDidFinish]; //Any of those calls in the switch doesn't work.
                break;
             case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                [self.delegate storeNavigationControllerDidFinish];
                break;
             case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
                [self.delegate storeNavigationControllerDidFinish];
             default:
                break;
         }
     }
  }

 - (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions       {
    for (SKPaymentTransaction* transaction in transactions) {
         NSLog(@"Transacción eliminada de la cola: %@", transaction.description);
     }
           [self.delegate storeNavigationControllerDidFinish]; //Not working

  }
4

1 に答える 1

0

デリゲートは assign プロパティを使用する必要があります。

 @property (assign, nonatomic) id <StoreNavigationControllerDelegate> delegate;

しかし、それはあなたの問題ではないかもしれません。トランザクションを完了する前、またはトランザクションを復元する前にデリゲート メソッドを呼び出してみましたか。これらのメソッドを呼び出す前に、ブレークポイントを設定するか、NSLog を使用してデリゲートが nil でないかどうかを確認しましたか?

NSLog(@"delegate: %@", self.delegate);
于 2012-08-14T16:41:02.930 に答える