2013-07-15 69 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文件中聲明該方法,它已經在parrent中聲明瞭。 – danypata

+0

對不起復制粘貼錯誤,didnt兒童在IB重新申報文本框 –

回答

0

這裏的問題是,您正在使用self.textEventName.text來訪問Parent.m中的textEventName屬性,但您只在Child.m中使用textEventName.text。這是毫無意義的 - 它是這樣的等價物:

[[ 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

Caleb的答案將解決問題,但這不是全部。真正的問題是你用下劃線前綴合成了這些屬性。所以當你在做textEventName.text時,你正在訪問你在Parent.h中聲明的實例變量而不是用屬性合成的變量。但是界面生成器被掛鉤以將UI元素分配給屬性。所以他們被分配給那些帶有下劃線前綴的人。因此,不帶下劃線的實例變量爲零。因此,您應該按照以下方式更改您的代碼。

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

你誤認爲子類的概念(繼承概念)與類的實例。他們完全沒有關係。當你繼承一個類的時候,你創建了一個新的類,它繼承了那個與這個類相關的屬性(some?)。這裏的關鍵字是你剛剛創建了一個新類。任何對象都可以創建這個子類的實例....不僅僅是這個子類的父類。

的概念是非常spplying所有面向對象的編程語言。在網上搜索「子類與實例」,你應該能夠看到關於這個主題的更多討論。祝你好運!

相關問題