2011-08-25 120 views
0

我有兩個視圖控制器,class Aclass BClass Bclass A的一個子類。 Class B有一個UITableView定義,並在父母class A,我希望能夠[table reloadData]。所以我想從父母class A訪問一個成員變量class B。我嘗試了整個前向聲明的事情,但那並沒有解決。在class B,我把@class A。然後在我的class A,我想聲明class B對象來訪問這樣的表:B *bView=[B alloc] init]; [bView.table reloadData] //doesn't work, I get error: Receiver B is a forward class and corresponding @interface may not exist從子類訪問UITableView

所以不知道爲什麼這不是工作,但也許我不應該甚至可以做這樣的。既然它是一個父類,有沒有更好的方法來訪問子成員變量?

+0

爲什麼你想讓一個類訪問其中的一個_subclasses_成員變量?如果B類繼承自A類,那麼它不能聲明'@class A';你需要導入A的界面。 –

+0

如何導入A的界面? – Snowman

+0

您需要在B的聲明文件(B.h)中寫入'#import「A.h」'而不是'@class A'。 –

回答

2

父母不會隱式訪問其子成員變量。所以從A的角度來看,B是任何舊對象。

如果B是A的,那麼你應該在波黑

#import "A.h" 

@interface B:A 
{ 
... 
} 
@property (readwrite,retain) UITableView *table; 

,如果你想在一個使用B,則您可以在「啊」這樣做的情況下,你想有一個做這個子類B成員

@class B 

@interface A:Foo 
{ 
B* bar; 
} 

還是不向前聲明麻煩,如果你不想做一個B成員

在這兩種情況下,在A.m

#import "B.h" 

您也可以使用#include警衛來停止雙重導入。

#ifndef AHEADER_H 
#define AHEADER_H 

@interface A:Foo 
... 
@end 

#endif 

無論您使用多少次#import A.h它只會被導入一次。

0

你不應該這樣做。爲什麼不重新加載子類實現中的表?如果您想將一些新行爲添加到現有代碼中,您可以在類B中覆蓋類A的方法。