2014-10-02 56 views
0

我想访问我的子类中的超类iBoutlets objetcs。那可能吗?。我正在尝试以下方式,但总是得到零。iOS可能访问我的子类中的超类iBoutlets对象?

这里是我的代码: 我的超类

#import <UIKit/UIKit.h> 

@interface SuperClassA : UIViewController { 

} 

@property (weak, nonatomic, getter=getDummyView) IBOutlet UIView *dummyView; 

@end 

@implementation SuperClassA 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    SubClassB *obj = [SubClassB new]; 
    [obj printSuperClassiBouletObject]; 
} 

@end 

我的子类:

#import <UIKit/UIKit.h> 

@interface SubClassB : SuperClassA { 

} 

@end 

@implementation SubClassB 

-(void)printSuperClassiBouletObject 
{ 
    NSLog(@"view: %@", [self getDummyView]); 
} 
@end 

上面的代码给了我零值始终。任何想法如何获得实际的iBoutlet对象?但是,当我通过iBoutlet作为函数参数,然后该对象不是零。在超类中,我尝试了强大的属性,在实现文件中使用@synthesize,但没有帮助。任何帮助,真的可能会被赞赏。

+0

IBOutlet不是类名,而只是界面生成器的一个标记,所以它可以识别对接口有意义的名称。这对你的代码不重要,只对XIB有意义。 – 2014-10-02 20:12:59

回答

0

相对于范围规则,IBOutlet没有什么特别之处。您可以通过在子类中包含其声明来继承超级属性。这样做的简单方法是将这些属性声明放入超类的公共接口(在superclass.h中)。既然我们知道子类必须导入它,我们知道那里的所有东西都可以被子类使用。

如果您希望子类访问属性而不是其他类,则需要更复杂的安排。这些“受保护的”声明需要进入只有超级和子类导入的第三个头文件。

换句话说...(简单的情况下):

// MySuper.h 
@interface MySuper : NSObject 
@property (weak,nonatomic) IBOutlet UIView *someOutlet; 
@end 

// MySub.h 
#import "MySuper.h" 

@interface MySub : MySuper 
// stuff for my sub 
@end 

现在无论MySuperMySub可以参考someOutlet

为了 “保护”,这样的事情:

// MySuper.h 
@interface MySuper : NSObject 
// only public stuff here 
@end 

// MySuper-protected.h 
@interface MySuper() 
@property (weak,nonatomic) IBOutlet UIView *someOutlet; 
@end 

// MySuper.m 
#import "MySuper.h" 
#import "MySuper-protected.h" 

// MySub.h 
// same as simple case 

// MySub.m 
#import "MySub.h" 
#import "MySuper-protected.h" 
0

我的猜测是问题出在这里:

SubClassB *obj = [SubClassB new]; 
[obj printSuperClassiBouletObject]; 

新的将使用默认初始值设定项,它将尝试使用您的类名(它是SubClassB)加载nib。你有SubClassB.xib设置你的项目出口?如果不是,则SubClassB将使用默认的objc初始化程序初始化为空属性。

试试这个:

SubClassB *obj = [[SubClassB alloc] initWithNibName:@"SuperClassA"]; //or xib name that SuperClassA uses to initialize 
0

最后,我能够用这种方式来实现这一!!!!

在我的子类,我改变了方法:

-(void)printSuperClassiBouletObject:(SuperClassA*)superClassObj 

,并在我的超级类我打电话这样说:

SubClassB *obj = [SubClassB new]; 
[obj printSuperClassiBouletObject:self]; 

在我的子类,我是访问超类对象和它的自变量来自超类实例。 感谢您的帮助!!!!!! :-)

相关问题