19

iPhoneアプリで作業していて、コントローラーのIBOutletフィールドへの(null)参照を取得しています。XIBでファイルの所有者として設定されているUIViewControllerサブクラスがあります。コントローラに接続されているUI要素のセットがあります。NIBからロードし、それらのUI要素にプロパティを設定しようとすると、それらが(null)であることがわかります。明確にするために、いくつかのコード:

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)"
4

5 に答える 5

49

1時間以上問題を調べた後で質問をすることで、私はそれを理解したと思います。

ビューを表示した後にテキストボックスをチェックするようにコードを変更しました...これですべてがインスタンス化されます。

想像してみてください。UI要素は、表示するまでインスタンス化されません。

于 2009-08-11T01:16:09.323 に答える
4

これが解決策です。

ビュー コントローラーの読み込みが完了するまで、IBOutlets を使用する準備はできていません。

たとえば、UILabels テキスト プロパティを設定する場合は、最初にコントローラーで NSString を設定してから、viewDidLoad などの場所でラベル テキスト プロパティを設定する必要があります。

だからあなたの firstViewController.m で:(これはストーリーボード用ですが、同じ考え方が適用されます)

- (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 の text プロパティを設定します。この段階までに、IBOutlet が作成され、準備が整いました。

- (void)viewDidLoad {
   [super viewDidLoad];
   self.label.text = self.stringForLabel;
}
于 2015-01-07T05:34:44.093 に答える
3

null IBOutlet ポインターの別の潜在的な原因は、アウトレット接続の作成後に Interface Builder で xib ファイルを保存するのを忘れていることです。

于 2010-04-24T10:33:34.543 に答える
0

ビューコントローラ(この場合はファイルの所有者)のviewプロパティがxibのビューに接続されていることを確認してください。textFieldはほぼ確実にそのサブビューであるため、これも配線することが重要です(設定しないと、ペン先が正しく読み込まれるとは思いません)。

于 2009-08-11T01:14:02.917 に答える
0

これは私がそれを行う方法です:

//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];
}
于 2016-06-13T10:14:53.840 に答える