2013-07-15 68 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所有面向对象的编程语言。在网上搜索“子类与实例”,你应该能够看到关于这个主题的更多讨论。祝你好运!

相关问题