2014-12-29 3 views
1

На самом деле я пытаюсь выяснить, как работает наследование в Objective-C. Моя проблема в том, что мой объект. allways возвращает «null».iOS - Как работает наследование?

Вот мой код:

Edit: Добавлен остальной код.

// ReportViewController.h 


#import <UIKit/UIKit.h> 
#import <MessageUI/MessageUI.h> 
#import "IAPHelper.h" 

@class Report, Category, GADBannerView; 

@interface ReportViewController : UIViewController <UIWebViewDelegate,  
NSFetchedResultsControllerDelegate> {NSString* _werbung;} 

@property (nonatomic, strong) GADBannerView *bannerView; 
@property (nonatomic, retain) NSString* werbung; 

- (id)initWithReport:(Report *)report category:(Category *)category ; 

@end 


// ReportViewController.m 

#import "ReportViewController.h" 
#import "IAPHelper.h" 

@interface ReportViewController() 
- (void)loadReport; 
- (void)setupFetchRequest; 
- (void)resizeNavigationContentViewToHeight:(CGFloat)height; 
- (NSString*) werbung; 
- (void)setWerbung:(NSString *)newwerbung; 
@end 

@implementation ReportViewController 
@synthesize werbung = _werbung; 

-(NSString*) werbung { 
return _werbung; 
} 

- (void)setWerbung:(NSString *)newwerbung { 
_werbung= newwerbung; 
} 

//Werbung ausblenden 
NSLog(@"Check for bought products"); 
if ([_werbung isEqual: @"gekauft"]) { 
    self.bannerView.hidden = TRUE; 
} 


- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) 
{ 

     self.edgesForExtendedLayout=UIRectEdgeNone; 
     self.navigationController.navigationBar.translucent = NO; 


} 

//ADMob 

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) { 
    if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) { 
     _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(20.0,850.0,728,90)];} 
if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight) { 
    _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(-10,615.0,728,90)];} 
    if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft) { 
     _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(-10,615.0,728,90)];} 
    } 
else 
    _bannerView = [[GADBannerView alloc] initWithFrame: CGRectMake(0,410,320,50)]; 
//initWithAdSize:kGADAdSizeBanner]; 
//initwithframe:CGRectMake(0.0,0.0,320,50)]; 

self.bannerView.adUnitID = @„xxxxxxxxxxxxxxxxx“; 
self.bannerView.rootViewController = self; 
GADRequest *request = [GADRequest request]; 
// Enable test ads on simulators. 
[self.view addSubview:(_bannerView)]; 
request.testDevices = @[ GAD_SIMULATOR_ID, @„xxxxxxxxxxxxxxxxxxxxxxx“ ]; 
[self.bannerView loadRequest:request]; 

    //Werbung ausblenden 
    NSLog(@"Check for bought products"); 
    if ([_werbung isEqual: @"gekauft"]) { 
    self.bannerView.hidden = TRUE; 
} 

NSLog(@"%@",_werbung); 
NSLog(@"%@",self.werbung); 
} 





// IAPHelper.m 
#import "IAPHelper.h" 
#import <StoreKit/StoreKit.h> 
#import "ReportViewController.h" 

@interface IAPHelper() <SKProductsRequestDelegate, SKPaymentTransactionObserver> 

@end 

@implementation IAPHelper 

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers 
{ 
//self = [super init]; 
if ((self = [super init])) { 

    // Store product identifiers 
    _productIdentifiers = productIdentifiers; 
    // Check for previously purchased products 
    _purchasedProductIdentifiers = [NSMutableSet set]; 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    for (NSString * productIdentifier in _productIdentifiers) { 
     BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]; 
     if (productPurchased) { 
      [_purchasedProductIdentifiers addObject:productIdentifier]; 
      NSLog(@"Previously purchased: %@", productIdentifier); 

      if ([productIdentifier isEqual:@"XXXXXXXXXXXXXXXXXXXXXXXXXX"]) { 

       ReportViewController *rvc = [[ReportViewController alloc] init]; 
       rvc.werbung = @"gekauft"; 


       NSLog(@"werbung gekauft!"); 
       NSLog(@"%@", rvc.werbung);  <- log's @"gekauft"; 
       } else { 
      NSLog(@"Not purchased: %@", productIdentifier); 
     } 
     } 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    }} 
    return self; 
} 

Мой вопрос: что я сделал не так? Может быть, у вас есть хороший учебник для меня тоже?

EDIT: Вы были правы, это было не о наследовании. Мое решение работает с UserDefaults.

+2

Можете ли вы сказать, какие объекты идут «null»? – Hemang

+0

NSLog (@ "% @", _ werbung); <- это «null» NSLog (@ "% @", self.werbung); <- это также «null» // был также отмечен в коде btw :) –

+0

Итак, где строка кода, где вы устанавливаете _werbung для чего-то, что не является нулевым? – gnasher729

ответ

1

Это не вопрос наследования - наследование определяет, какое поведение подкласс будет приобретать у его родителя. Проблема, похоже, является одним из примеров.

ReportViewController - класс. Так что это не настоящий актер. Это просто описание того, как будут создаваться любые созданные ReportViewController. Как конституция.

Когда вы вызываете alloc] init], вы создаете один новый экземпляр контроллера вида. Затем вы устанавливаете рекламу как купленную на этом экземпляре. Вы не помещаете экземпляр нигде или не держите его в руках. Таким образом, этот случай перестает существовать.

В другом месте, в другом экземпляре, вы проверяете стоимость рекламы. Никто ничего подобного не сказал. Таким образом, вы видите значения nil.

Думайте об этом точно так же, как NSString. В приведенном ниже коде должно stringB изменить значение?

NSMutableString *stringA = [[NSMutableString alloc] init]; 
NSMutableString *stringB = [[NSMutableString alloc] init]; 

[stringA appendString:@"Mo' string for ya'"]; 
+0

Либо это, либо неверные предположения о том, когда [viewDidLoad] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/viewDidLoad) называется. –

+0

@ A-Live Я потерял подсчет количества подклассов UIViewController, которые я видел, чтобы попытаться передать свойства набора представлениям, неявно предполагая, что никакие свойства не будут установлены до тех пор, пока не будет загружено представление. Хотя, по крайней мере, под iOS 6+, если время ограничено, вы можете просто добавить комментарий к тому, что то, что вы собираетесь делать, крайне неэффективно и добавляет принудительную загрузку вида в сеттер ... – Tommy

1

ReportViewController, что вы используете, чтобы установить значение werbung не тот же контроллер, где вы проверяете значение. Тот, где вы выполняете назначение, является локальным для метода, в котором он выделяется.

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