2014-10-02 55 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]; 

在我的子類,我是訪問超類對象和它的自變量來自超類實例。 感謝您的幫助!!!!!! :-)

相關問題