2014-01-09 3 views
0

У меня возникла проблема во время работы и тестирования моего приложения.UIViewcontroller не открывается при нажатии кнопки

Я использовал учебник, предлагаемый GeekyLemon.

Часть 1: http://www.geekylemon.com/xcode-in-app-purchase-part-1

Часть 2: http://www.geekylemon.com/xcode-in-app-purchase-part-2

Часть 3: http://www.geekylemon.com/xcode-in-app-purchase-part-3

Часть 4: http://www.geekylemon.com/xcode-in-app-purchase-part-4

Учебник учит, как использовать в приложении покупки в вашем приложении и использовать его для создания функции «удалить рекламу» для вашего приложения.

Закончив вторую часть учебника, я решил запустить свой код, чтобы увидеть, что я сделал до сих пор. Контроллер представления с моей кнопкой «Удалить рекламу» отлично отображается, когда я запускаю свое приложение. Однако, когда я нажимаю на кнопку, она отправляет меня на экран, который является черным цветом вместо контроллера вида, к которому я хочу, чтобы он переходил.

Это скриншот моих двух контроллеров представления в моем файле раскадровки. Контроллер вида слева имеет мою кнопку «Удаляет рекламу». Когда он щелкнут, я хотел бы, чтобы он перешел к контроллеру представления справа.

enter image description here

Ниже приведены скриншоты мое приложение в симуляторе до и после того, как я нажмите кнопку "Удалить объявления":

enter image description here

enter image description here

Мой SettingsViewController.h (на заказ класс для моего первого контроллера просмотра в раскадровке):

#import <UIKit/UIKit.h> 
#import <MessageUI/MessageUI.h> 
#import <StoreKit/StoreKit.h> 
#import "PurchasedViewController.h" 

@interface SettingsViewController : UITableViewController < MFMailComposeViewControllerDelegate> 

@property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton; 

@property (weak, nonatomic) IBOutlet UILabel *Label; 
- (IBAction)PurchaseItem:(id)sender; 
@property (strong, nonatomic) PurchasedViewController *purchaseController; 
-(void)Purchased; 

@end 

Мой SettingsViewController.m:

#import "SettingsViewController.h" 
#import "SWRevealViewController.h" 
#define k_Save @"Saveitem" 


@interface SettingsViewController() 

@property (nonatomic, strong) NSArray *menuItems; 

@end 

@implementation SettingsViewController 

@synthesize Label; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
_sidebarButton.target = self.revealViewController; 
_sidebarButton.action = @selector(revealToggle:); 
_sidebarButton.tintColor = [UIColor colorWithWhite:0.1f alpha:0.7f]; 
NSUserDefaults *saveapp = [NSUserDefaults standardUserDefaults]; 
bool saved = [saveapp boolForKey:k_Save]; 
if (!saved) { 
    /// not save code here 
} else { 
    ///saved code here 
    Label.text = @"Item has been purchased."; 

// Add pan gesture to hide the sidebar 
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; 
// Do any additional setup after loading the view. 
} 
} 



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
if(indexPath.row == 0 && indexPath.section == 3){ 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://howtocrackthedbq.blogspot.com/"]]; 
} else if(indexPath.row == 1 && indexPath.section == 1){ 
     if ([MFMailComposeViewController canSendMail]) { 
      MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; 
      mailViewController.mailComposeDelegate = self; 
      [mailViewController setSubject:@"[How to crack the DBQ] Support request"]; 
      [mailViewController setToRecipients:[NSArray arrayWithObject:@"[email protected]"]]; 
      [self presentModalViewController:mailViewController animated:YES]; 
     } 
      } 

} 

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error{ 
[self dismissModalViewControllerAnimated:YES]; 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 



-(void)Purchased { 
Label.text = @"Item has been purchased."; 
NSUserDefaults *saveapp = [NSUserDefaults standardUserDefaults]; 
[saveapp setBool:TRUE forKey:k_Save]; 
[saveapp synchronize]; 
} 
- (IBAction)PurchaseItem:(id)sender { 

_purchaseController = [[PurchasedViewController alloc] initWithNibName:nil bundle:nil]; 
_purchaseController.productID = @"com.moappsco.crackingthedbq.dbq1"; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:_purchaseController]; 
[self presentViewController:_purchaseController animated:YES completion:NULL]; 
[_purchaseController getProductID:self]; 
} 
@end 

Мой PurchasedViewController.h (Пользовательский класс для моего другого контроллера представления показано на правой стороне моего раскадровки):

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

@interface PurchasedViewController : UIViewController<SKPaymentTransactionObserver,SKProductsRequestDelegate> { 
} 
@property (strong, nonatomic) SKProduct *product; 
@property (strong, nonatomic) NSString *productID; 
@property (strong, nonatomic) IBOutlet UILabel *productTitle; 
@property (strong, nonatomic) IBOutlet UITextView *productDescription; 
@property (strong, nonatomic) IBOutlet UIButton *buyButton; 

- (IBAction)Restore:(id)sender; 
- (IBAction)BuyProduct:(id)sender; 
- (IBAction)GoBack:(id)sender; 

-(void)getProductID:(UIViewController *)viewController; 

@end 

Мой PurchasedViewController.m:

#import "PurchasedViewController.h" 
#import "SettingsViewController.h" 

@interface PurchasedViewController() 

@property (strong, nonatomic) SettingsViewController *homeViewController; 

@end 

@implementation PurchasedViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
_buyButton.enabled = NO; 
// Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

- (IBAction)Restore:(id)sender { 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

- (IBAction)BuyProduct:(id)sender { 
SKPayment *payment = [SKPayment paymentWithProduct:_product]; 
[[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 

- (IBAction)GoBack:(id)sender { 
[self dismissViewControllerAnimated:YES completion:NULL]; 

} 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 
[self UnlockPurchase]; 
} 

-(void)getProductID:(SettingsViewController *)viewController;{ 
_homeViewController = viewController; 

if([SKPaymentQueue canMakePayments]){ 
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:self.productID]]; 
    request.delegate = self; 
    [request start]; 
} else 
    _productDescription.text = @"Please enable in-app purchases in your settings."; 
} 


#pragma mark _ 
#pragma mark SKProductsRequestDelegate 

-(void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 
NSArray *products = response.products; 
if (products.count != 0) { 
    _product = products[0]; 
    _buyButton.enabled = YES; 
    _productTitle.text = _product.localizedTitle; 
    _productDescription.text = _product.localizedDescription; 
} else { 
    _productTitle.text = @"Product not found."; 
} 
products = response.invalidProductIdentifiers; 

for(SKProduct *product in products) { 
    NSLog(@"Product not found: %@", product); 
} 


} 
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 
for (SKPaymentTransaction *transaction in transactions) { 
    switch (transaction.transactionState) { 
     case SKPaymentTransactionStatePurchased:[self UnlockPurchase]; 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
      break; 
     case SKPaymentTransactionStateFailed:NSLog(@"Transaction Failed"); 
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
     default: 
      break; 

    } 
} 
} 

-(void)UnlockPurchase { 
_buyButton.enabled = NO; 
[_buyButton setTitle:@"Purchased" forState:UIControlStateDisabled]; 
[_homeViewController Purchased]; 
} 
@end 

При необходимости, вы можете загрузить мой Xcode проект на Github: https://github.com/MoAppsCo/iOS-Apps/tree/master/How%20to%20crack%20the%20DBQ

ответ

1

Вы не инстанцируете ваш контроллер должным образом. Когда контроллер находится в раскадровке, вы не должны использовать initWithNibName: сверток: (это для контроллеров на основе XIb), вы должны дать свой контроллер идентификатор в раскадровке и использование:

_purchaseController = [self.storyboard instantiateViewControllerWithIdentifier:@"YourNameHere"]; 

Конечно, вы также мог бы сделать это, подключив к этому контроллеру segue, с помощью контроллера настроек и используя параметр executeSegueWithIdentifier: отправитель: вместо этого.

+7

Не могли бы ли вы проголосовать за вопрос, почему этот ответ не пригодится? – rdelmar

Смежные вопросы