2016-07-30 11 views
0

Ich habe eine ContentPageViewController-Klasse, es hat die IBOutlet Sachen. Ich schreibe meinen Getter von ContentPageViewController im ViewController wie der folgende Code.Die UILabel ist null

ContentPageViewController.h

@interface ContentPageViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UILabel *busName; 
@property (weak, nonatomic) IBOutlet UILabel *busTime; 
@property (weak, nonatomic) IBOutlet UILabel *busType; 

@end 

ViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // instantiation from a storyboard 
    ContentPageViewController *page = [self.storyboard instantiateViewControllerWithIdentifier:@"ContentPageViewController"]; 
    self.page = page; 

    // send url request 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://api.apb-shuttle.info/now" ]]; 

    [self sendURLRequest:request]; 
    // add the view of ContendPageViewController into ViewController 
    [self.view addSubview:self.page.view]; 
} 

// It works if i remove the following code 
- (ContentPageVC *)page 
{ 
    if (_page) _page = [[ContentPageViewController alloc] init]; 

    return _page; 
} 

Es ist nichts passiert, wenn ich es aktualisiert. Und es hat mir ein Nichts gegeben.

- (void)updateUI 
{ 
    // I got null here 
    NSLog("%@", self.page.busName) 
    // The spacing style font 
    NSDictionary *titleAttributes = @{ 
            NSKernAttributeName: @10.0f 
           }; 
    NSDictionary *attributes = @{ 
          NSKernAttributeName: @5.0f 
          }; 

    self.page.busName.attributedText = [[NSMutableAttributedString alloc] initWithString:bus.name 
                  attributes:titleAttributes]; 
    self.page.busTime.attributedText = [[NSMutableAttributedString alloc] initWithString:bus.depart 
                  attributes:titleAttributes]; 
    self.page.busType.attributedText = [[NSMutableAttributedString alloc] initWithString:bus.note 
                  attributes:attributes]; 

} 

Der folgende Code ist, wenn ich die updateUI genannt:

- (void)sendURLRequest:(NSURLRequest *)requestObj 
{ 
    isLoading = YES; 
    [RequestHandler PerformRequestHandler:requestObj withCompletionHandler:^(NSDictionary *data, NSError *error) { 
     if (!error) { 
      bus = [JSONParser JSON2Bus:data]; 
      // Add the bus object into the array. 
      [self.busArray addObject: bus]; 
      [[NSOperationQueue mainQueue] addOperationWithBlock: ^{ 
       [self updateUI]; 
       isLoading = NO; 
      }]; 
     } else { 
      NSLog(@"%@", [error localizedDescription]); 
     } 
    }]; 
} 

Aber es hat funktioniert, wenn ich die Getter oben entfernt. Ich habe keine Ahnung, wie es funktioniert, bitte geben Sie mir einen Hinweis. Vielen Dank.

+0

Alloc 'init' wird sehr wenig Initialisierung im Vergleich zu, sagen wir, initWithNibName oder Instanziierung von einem Storyboard. Die Standardimplementierung wird sicherlich keine Subviews initialisieren – danh

+0

Haben Sie eine xib/Storyboard-Datei zusammen mit Ihrem View-Controller eingerichtet? –

+0

Hallo @danh, ich habe meinen Artikel über Instanziierung aktualisiert, bitte sehen Sie sich das an. Kannst du irgendein Material über dich empfehlen? Danke vielmals. –

Antwort

4
  1. Überprüfen Sie, ob Ihr IBOutlet angeschlossen ist.
  2. überprüfen Sie die Methode, die Sie aufgerufen Aufruf wird nicht vor dem Blick aus dem Storyboard/nib erstellt

EDIT

Die Codezeilen, die Sie, zwingenden Ihre Getter hinzu. Und jedes Mal, wenn Sie self.page aufrufen, erstellen Sie eine neue Instanz!

// It works if i remove the following code 
- (ContentPageVC *)page 
{ 
    if (_page) _page = [[ContentPageViewController alloc] init]; 

    return _page; 
} 

Es sollte wie so sein:

// It works if i remove the following code 
- (ContentPageVC *)page 
{ 
    if (!_page) _page = [[ContentPageViewController alloc] init]; // Added the ! mark, only if nil you would create a new instance. 

    return _page; 
} 

Und Sie alloc init auf sie anrufen, so dass ihr nicht die gleiche Instanz von Storyboard!

So sollen Sie dies tun:

- (ContentPageVC *)page 
{ 
    if (!_page) _page = [self.storyboard instantiateViewControllerWithIdentifier:@"ContentPageViewController"]; 

    return _page; 
} 

und entfernen Diesen Codezeilen:

// instantiation from a storyboard 
    ContentPageViewController *page = [self.storyboard instantiateViewControllerWithIdentifier:@"ContentPageViewController"]; 
    self.page = page; 

Jedes Mal, wenn Sie "self.page" die Überschreibung Getter-Funktion rufen rufen. und die gleiche Instanz zurückgeben.

+0

(1). Ich bin mir sicher, dass es mit dem ContentPageViewController im Storyboard verbunden ist. (2). Ich habe einige Print-Code in der ViewDidLoad des ContentPageViewController hinzugefügt. Ich bin mir sicher, dass ich die Benutzeroberfläche nach dem Laden aktualisiert habe. –

+0

Von welcher Funktion wird "updateUI" aufgerufen? AnsichtDidLoad()? Und verwenden Sie Storyboards oder Nib-Dateien? – MCMatan

+0

Tut mir leid, dass ich dich verwirrt habe, ich habe meinen Code aktualisiert, bitte sieh ihn dir an. Vielen Dank. –