Frage

Ich arbeite an einem iPhone-App und bin immer (null) Verweise auf IBOutlet Felder in meinem Controller. Ich habe eine UIViewController Unterklasse, die als Datei Besitzer in meinem XIB gesetzt. Ich habe eine Reihe von Oberflächenelementen, die in die Steuereinheit verdrahtet sind. Nachdem er von NIB Laden und versuchte, Eigenschaften auf diesen UI-Elementen zu setzen, finde ich, dass sie (null). Um zu klären, einige Code:

ExpandSearchPageController.h:

@interface ExpandSearchPageController : UIViewController
{
  IBOutlet UITextView * completeMessageView;
}

-(void)checkTextField;

@property (nonatomic, retain) IBOutlet UITextView * completeMessageView;

ExpandSearchPageController.m:

@implementation ExpandSearchPageController

@synthesize completeMessageView;

-(void)checkTextField
{
  NSLog(@"text field: %@",completeMessageView);
}

ExpandSearchPageController als Datei Besitzer für ExpandSearchPage.xib gesetzt. ExpandSearchPage.xib der UITextView verdrahtet zum completeMessageView.

Wenn ich rufe

ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]];

[searchExpanderPage checkTextField];

Das Ergebnis ist

"text field: (null)"
War es hilfreich?

Lösung

Ich denke, die Frage zu stellen, nachdem über eine Stunde auf dem Problem der Suche führte mich um es herauszufinden:

Ich habe gerade meinen Code in das Textfeld nach dem Anzeigen der Ansicht zu überprüfen ... jetzt alles instanziiert wird.

Stellen Sie sich vor, dass: die UI-Elemente sind nicht instanziert, bis Sie sie angezeigt werden

Andere Tipps

Das ist die Lösung.

Die IBOutlets sind nicht einsatzbereit, bis der View-Controller geladen wird.

Zum Beispiel, wenn Sie einen UILabels Text-Eigenschaft festlegen möchten, müssen Sie zunächst eine NSString auf dem Controller setzen müssen, und stellen Sie dann die Etiketten Eigenschaft text in irgendwo wie viewDidLoad.

Also in Ihrem firstViewController.m: (Dies ist für Storyboards, aber die gleiche Idee gilt)

- (void)buttonPress:(id)sender {
   [self performSegueWithIdentifier:@"mySegue" sender:self];
}

- (void)prepareForSegue(UIStoryboardSegue *)segue sender:(id)sender {
   SecondViewController *secondViewController = [segue destinationViewController];
   secondViewController.stringForLabel = @"My Label String";
}

Dann in der .h Ihrem secondViewController:

@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) NSString *stringForLabel;

Dann setzen wir die Eigenschaft text auf der UILabel im viewDidLoad von secondViewController.m. Zu diesem Zeitpunkt hat sich die IBOutlet erstellt und ist bereit zu gehen.

- (void)viewDidLoad {
   [super viewDidLoad];
   self.label.text = self.stringForLabel;
}

Eine weitere mögliche Ursache für einen Null-IBOutlet Zeiger zu vergessen die xib Datei im Interface Builder zu speichern, nachdem die Abgangsverschraubung zu schaffen.

Machen Sie die Ansicht Eigentum Ihres View-Controller sicher (dh Datei-Besitzer in diesem Fall) ist die Ansicht in Ihrem xib verdrahtet. Als Ihr Textfield mit ziemlicher Sicherheit ein Subview das heißt, es ist wichtig, dass in zu verdrahtet bekommen (und ich glaube nicht, die Spitze, ohne dass Sein Satz richtig geladen wird).

Dies ist, wie ich es tun:

//in your view controller
-(void)setUp
{
    [self.cardView layoutIfNeeded];
    LearnCardPlainText *cardNib = [[[UINib nibWithNibName:@"LearnCardPlainText" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0];
    cardNib.frame = self.cardView.frame;
    [cardNib setUpWithPart:learnModel];
    [self.view addSubview:cardNib];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top