2011-12-13 32 views
0

我刚开始学习iOS编程,并遇到继承问题。有2个文件。如何在iOS中继承工作sdk

第一个文件

页眉

#import <UIKit/UIKit.h> 
@interface ViewController : UIViewController { 
    UILabel *myLabel; 
} 
@property (nonatomic, retain) IBOutlet UILabel *myLabel; 
@end 

实现:

#import "ViewController.h" 
#import "NewClass.h" 
@implementation ViewController 
@synthesize myLabel; 
#pragma mark - View lifecycle 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    myLabel.text = @"ViewController text!";  
    NewClass *myClass = [[[NewClass alloc] init] autorelease]; 
    [myClass setLabelText]; 
} 
@end 

第二个文件

页眉:

#import "ViewController.h" 
@interface NewClass : ViewController 
-(void) setLabelText ; 
@end 

实现:

#import "NewClass.h" 
@implementation NewClass 
- (void) setLabelText { 
    myLabel.text = @"NewClass text!"; 
} 
-(id)init { 
    self = [super init];          
    if (self != nil) {           
    } 
    return self;       
} 
@end 

我和IB设置myLabel出口。

为什么当我打电话[myClass setLabelText];什么都没有发生?还保留了“ViewController文本!”在标签视图上。 我的问题在哪里?我如何更改ViewController::myLabel.textNewClass

回答

2

这不是你正在做的继承。在您的视图控制器的实现,你有下面的代码

NewClass *myClass = [[[NewClass alloc] init] autorelease]; 
[myClass setLabelText]; 

这只是创建类的NewClass的一个实例,该实例上设置LabelText的。您从不显示或将其添加到视图。

+0

更糟糕的是,因为myClass是ViewController的子类,所以当(或如果)加载时,它实际上会创建它自己的实例myClass ...并循环代码。 Voila - 堆栈溢出错误! –

0

这个例子可以帮助ü其中u可以通过点击button.implement下面的代码在乌拉圭回合例如更改标签文本

//class1.h

IBOutlet UILabel *text1; 

@属性(非原子,保留) UILabel * text1;

-(IBAction)press:(id)sender; 

//class1.m

-(IBAction)press:(id)sender 

{

Class2 *method = [[Class2 alloc]init]; 
NSString *string = [method sayhello]; 

[method release]; 
text1.text = string; 

}

//class2.h

{

}

-(NSString *)sayhello; 

@end

//等级2。米

-(NSString *)sayhello 

{

返回@ “你好”;

}

连接按钮到文件的所有者..

0
NewClass *myClass = [[[NewClass alloc] init] autorelease];  
[myClass setLabelText]; 

这里要创建经由分配/初始化新的视图控制器(未通常,如果你有视图控制器背衬XIB文件,你通常会使用initWithNibName :)然后在IBOutlet上设置一个属性。此时,由于您尚未加载笔尖,因此插座将为nil

另外,正如Nick Bull指出的那样,您只是创建一个实例,而不是在任何地方显示它。所以即使你使用了initWithNibName,你也不会看到你的改变,除非你以某种方式呈现视图控制器。

0

等等......从它的外观来看,你将会遇到堆栈溢出的一些严重问题:当你加载一个ViewController时,它反过来创建myClass。因为myClass是ViewController的一个子类,所以当它被加载后,它会自动创建它自己的变量'myClass'......等等,这将一直持续下去,或者直到你遇到堆栈溢出错误。

事实上,我很困惑你的代码。也许现在可能是时候重新考虑你正在努力实现的目标以及你的代码应该做什么?

+0

你在谈论'self = [super init];'在NewClass? – KopBob

+1

@ user1094316不,我在说NewClass * myClass = [[[NewClass alloc] init] autorelease]; - 因为NewClass是ViewController的一个子类,当myClass加载时它会再次运行这条线。然后再次。再一次...直到你的应用程序崩溃! –

+0

你能解释我如何解决它吗? – KopBob