IBOutletインスタンスは、NIBから読み込んだ後(ヌル)であります
-
12-09-2019 - |
質問
私がiPhoneアプリに取り組んでいますし、私のコントローラでIBOutletフィールドに(ヌル)の参照を取得しています。私はXIBでファイルの所有者として設定されているのUIViewControllerのサブクラスを持っています。私は、コントローラに配線されているUI要素のセットを有しています。 NIBからロードすると、これらのUI要素のプロパティを設定しようとした後、私は、彼らが(ヌル)であることを見つけます。明確にするために、いくつかのコード:
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はExpandSearchPage.xibのためのファイルの所有者として設定されています。 ExpandSearchPage.xibのUITextViewはcompleteMessageViewに配線されます。
私がコールすると、
ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]];
[searchExpanderPage checkTextField];
結果が
"text field: (null)"
解決
私は時間以上の問題を見た後、質問を推測では、それを把握するために私を導います:
私はちょうど今ではすべてがインスタンス化されています...ビューを表示した後、テキストボックスをチェックするために自分のコードを変更します。
ことを想像してみて!あなたがそれらを表示するまでのUI要素がインスタンス化されていません。
他のヒント
これが解決されます。
IBOutletsビューコントローラがロードを完了するまで使用する準備ができていない。
あなたはUILabelsテキストプロパティを設定したい場合は、たとえば、あなたが最初にあなたのコントローラにNSStringのを設定し、どこかのviewDidLoadのように、ラベルのテキストプロパティを設定する必要があります。
あなたのfirstViewController.m中のSO:(これは絵コンテのためですが、同じ考え方が適用されます)
- (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";
}
次に、あなたのsecondViewControllerの.hファイルでます:
@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) NSString *stringForLabel;
その後、我々はsecondViewController.mののviewDidLoadで、UILabel上のテキストプロパティを設定します。 この段階では、IBOutletを作成して行く準備ができているされています。
- (void)viewDidLoad {
[super viewDidLoad];
self.label.text = self.stringForLabel;
}
ヌルIBOutletポインタの別の潜在的な原因は、出口接続を作成した後、Interface BuilderでXIBファイルを保存するために忘れされます。
あなたのビューコントローラのビュープロパティを確認してください(つまり、この場合は、ファイルの所有者は)あなたのXIBのビューに配線されています。あなたのテキストフィールドは、ほぼ確実にそのサブビューであるとして、それはあまりにもに配線することを取得することが重要だ(と私はペン先がそのビーイングを設定せずに正常にロードされますとは思わない)。
これは、私はそれを行う方法です。
//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];
}