سؤال

أنا أعمل على تطبيق iPhone وأحصل على (null) مراجع إلى حقول iBoutlet في جهاز التحكم الخاص بي. لدي فرقة فرعية UiviewController التي تم تعيينها كملك الملف في XIB الخاص بي. لدي مجموعة من عناصر 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 كمالك الملف لتوسيع SeachSearchPage.xib. COMPLESSEAMPAGE.XIB's UITEXTVIEW هو السلكية إلى اكتمالها.

عندما اتصلت

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

[searchExpanderPage checkTextField];

النتيجه هي

"text field: (null)"
هل كانت مفيدة؟

المحلول

أعتقد أن طرح السؤال بعد النظر في المشكلة لأكثر من ساعة قادني لمعرفة ذلك:

لقد غيرت التعليمات البرمجية الخاصة بي للتحقق من مربع النص بعد عرض العرض ... الآن تم إنشاء مثيل لكل شيء.

تخيل أن: لم يتم إنشاء عناصر UI مثبتة حتى تعرضها!

نصائح أخرى

هذا هو الحل.

لا تكون iboutlets جاهزة للاستخدام حتى تنتهي وحدة التحكم في العرض.

على سبيل المثال، إذا كنت ترغب في تعيين خاصية نص Uilabels، فستحتاج إلى تعيين nsstring على وحدة التحكم الخاصة بك أولا، ثم قم بتعيين خاصية Text Labels في مكان ما مثل 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";
}

ثم في .h الخاص بك secondviewcontroller الخاص بك:

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

ثم وضعنا خاصية النص على Uilabel، في شاشة ViewDIDIDROVENTROLLER.M. في هذه المرحلة، تم إنشاء IBoutlet وهي جاهزة للذهاب.

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

هناك سبب محتمل آخر لمؤشر iboutlet Null ينسى حفظ ملف XIB في منشئ الواجهة بعد إنشاء اتصال منفذ.

تأكد من عرض خاصية الرؤية لوحدة التحكم الخاصة بك (مالك ملف IE في هذه الحالة) إلى العرض في XIB الخاص بك. نظرا لأن TextField الخاص بك هو بالتأكيد تقريبا فرعا فرعيا لذلك، فمن المهم الحصول على ذلك سلكي أيضا (ولا أعتقد أن المنصوصية ستتحمل بشكل صحيح دون تعيين).

هذه هي الطريقة التي أفعلها:

//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];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top