2013-07-15 6 views
0

Я пытаюсь применить базовую концепцию наследования, мне нужно отобразить родительский viewcontorller textfield.text в контроллере детского представления. Но я получаю нулевые значенияНе удается получить доступ к переменным контроллера родительского представления

Parent.h

@interface EditEventViewController : UITableViewController 
{ 
UITextField *textEventName; 
    UITextField *textEventLocation; 
    UITextField *textStartTime; 
    UITextField *textEndTime; 
    UITextField *textDate; 
    UITextField *textEndDate; 

    //tried IBOutlet version such as 
    //IBOutlet UITextField *textEventName;//this didnt work too 
} 

@property (nonatomic, strong) IBOutlet UITextField *textEventName; 
@property (nonatomic, strong) IBOutlet UITextField *textEventLocation; 
@property (nonatomic, strong) IBOutlet UITextField *textStartTime; 
@property (nonatomic, strong) IBOutlet UITextField *textEndTime; 
@property (nonatomic, strong) IBOutlet UITextField *textDate; 
@property (nonatomic, strong) IBOutlet UITextField *textEndDate; 

Parent.m

@synthesize textEndDate=_textEndDate; 
@synthesize textDate=_textDate; 
@synthesize textEndTime=_textEndTime; 
@synthesize textEventName=_textEventName; 
@synthesize textStartTime=_textStartTime; 
@synthesize textEventLocation=_textEventLocation; 

//test inherritance here 
    DeleteFromCalendar *deleteControl=[[DeleteFromCalendar alloc] init]; 
    NSLog(@"Delete Request for text name %@",self.textEventName.text); 
    [deleteControl displayParentStrings]; 

Child.h

#import "EditEventViewController.h" 

@interface DeleteFromCalendar : EditEventViewController 

-(void)displayParentStrings; 

@end 

Child.m

-(void)displayParentStrings 
{ 
    NSLog(@"Display Parent Strings"); 
    NSLog(@"DeleteFromCalendar Event Name %@",textEventName.text); 
    NSLog(@"DeleteFromCalendar Event %@",textEventLocation.text); 
} 

NSLog:

Delete Request for text name Aeronautical Knowledge Review 
DeleteFromCalendar Event Name (null) 
DeleteFromCalendar Event Lcoation (null) 

Почему я получаю пустой?

+0

Вы подключили элементы пользовательского интерфейса до своих выходов в построителе интерфейса? Кроме того, вам не нужно синтезировать свойства в дочернем, если они были объявлены в родительском. (И в Xcode 4 вам все равно не нужно синтезировать свойства - это теперь автоматически.) –

+1

Не объявляйте снова свойства в child.m, он переопределяет родительские. Также не объявляйте переменную как свойство и член класса, используйте только один из них. ;). Также вам не нужно объявлять метод в файле child.h, он уже объявлен в паритре. – danypata

+0

Извините, скопируйте ошибку патча, не повторно объявляйте текстовые поля в дочернем объекте –

ответ

0

Проблема заключается в том, что вы используете self.textEventName.text для доступа к объекту textEventName в Parent.m, но вы используете только textEventName.text в Child.m. Это бессмысленно - это эквивалент этого:

[[ textEventName] text]; // Error: you're not specifying the receiver of the message 

Если вы хотите получить доступ к свойству объекта, необходимо указать, какой объекта. В этом случае этот объект равен self.

Измените код в -displayParentStrings таким образом:

NSLog(@"DeleteFromCalendar Event Name %@", self.textEventName.text); 
NSLog(@"DeleteFromCalendar Event %@", self.textEventLocation.text); 

self. Добавление решит вашу проблему.

+0

Я уже пробовал, что перед отправкой вопроса не работал, поэтому я задал вопрос. –

+0

Мой ответ и Ахмед указывают на некоторые серьезные недостатки в вашем коде, но, возможно, есть и другие. Почему бы не исправить то, что мы показали вам, заменив ваш код на Ahmed's, а затем отредактируйте свой вопрос, чтобы включить дополнительную информацию, если вы все еще не можете заставить его работать? – Caleb

0

Ответ Калеба решит проблему, но это еще не все. Реальная проблема заключается в том, что вы синтезировали свойства с помощью префиксов подчеркивания. Поэтому, когда вы делаете textEventName.text, вы получаете доступ к переменным экземпляра, который вы указали в Parent.h НЕ переменными, синтезированными со свойствами. Но конструктор интерфейса подключен для привязки элементов интерфейса к свойствам. Поэтому они назначаются тем, у кого есть префиксы подчеркивания. Следовательно, переменные экземпляра без подчеркиваний равны нулю. Поэтому вы должны изменить свой код следующим образом.

Parent.h

@interface EditEventViewController : UITableViewController 

// you don't need the instance variables 

@property (nonatomic, weak) IBOutlet UITextField *textEventName; 
@property (nonatomic, weak) IBOutlet UITextField *textEventLocation; 
@property (nonatomic, weak) IBOutlet UITextField *textStartTime; 
@property (nonatomic, weak) IBOutlet UITextField *textEndTime; 
@property (nonatomic, weak) IBOutlet UITextField *textDate; 
@property (nonatomic, weak) IBOutlet UITextField *textEndDate; 

Parent.m

// you don't need to synthesize 

//test inherritance here 
    DeleteFromCalendar *deleteControl=[[DeleteFromCalendar alloc] init]; 
    NSLog(@"Delete Request for text name %@",self.textEventName.text); 
    [deleteControl displayParentStrings]; 

Child.h

#import "EditEventViewController.h" 

@interface DeleteFromCalendar : EditEventViewController 

-(void)displayParentStrings; 

@end 

Child.m

-(void)displayParentStrings 
{ 
    NSLog(@"Display Parent Strings"); 
    NSLog(@"DeleteFromCalendar Event Name %@", self.textEventName.text); 
    NSLog(@"DeleteFromCalendar Event %@", self.textEventLocation.text); 
} 

или

-(void)displayParentStrings 
{ 
    NSLog(@"Display Parent Strings"); 
    NSLog(@"DeleteFromCalendar Event Name %@", _textEventName.text); 
    NSLog(@"DeleteFromCalendar Event %@", _textEventLocation.text); 
} 
+0

* доступ к переменным экземпляра, указанному в Parent.h * Хороший улов - это объясняет, почему компилятор не жалуется. Я бы удалил вторую версию '-displayParentStrings' - лучше использовать атрибуты свойств в подклассе, чем напрямую использовать ivars. – Caleb

+0

@Caleb Я согласен, что лучше использовать свойства. Я просто включил это для полноты –

0

Вы перепутали понятие подкласса (понятие наследования) против экземпляра класса. Они совершенно не связаны. Когда вы подклассифицируете класс, вы создаете новый класс, который наследует те (некоторые?) Свойства, связанные с этим классом.Ключевое слово здесь состоит в том, что вы только что создали новый класс. Любые объекты могут создавать экземпляр этого подкласса .... не только родительский элемент этого подкласса.

Концепция очень подходит для всех объектно-ориентированных языков программирования. Найдите в Интернете «subclass vs instance», вы сможете увидеть больше дискуссий по этой теме. Удачи!

Смежные вопросы