2013-06-26 71 views
1

我試圖獲得並從它的父類的實例,設置屬性。它的工作原理,如果我只是創建對象並獲取或直接設置它們,但如果我把情況下,在一個NSArray它說,它沒有發現:無法訪問實例的屬性中的NSArray

物業的POS'的類型「ID」的對象沒有找到

我有這樣的ViewController稱爲Gameplay.m(UIViewController的),我創建viewDidLoad方法類牆(的UIView)的實例:

walls = [[NSMutableArray alloc] initWithCapacity:10]; 

for(int i = 0; i < 10; i++) { 
    Wall *wall = [[Wall alloc] initWithFrame:CGRectMake(0, 0, 480, 320)]; 
    wall.opaque = NO; 
    wall.backgroundColor = [UIColor clearColor]; 
    [wall setFrame:CGRectMake(levelpos.x + 200 * i, levelpos.y, 200, 200)]; 
    wall.pos = CGPointMake(levelpos.x + 200 * i, levelpos.y); //setting instance attribute works! 
    [self.view addSubview:wall]; 
    wall.userInteractionEnabled = NO; 
    [walls addObject:wall]; 
} 

walls[0].pos = CGPointMake(0, 0); //Doesn't work! 

類壁的特性「POS」聲明如下在Wall.h中:

@interface Wall : UIView 

@property (nonatomic, assign) CGPoint pos; 

我在Objective C和OOP方面的經驗都很少,肯定有一些我很想念。

回答

2

數組下標返回id類型的對象,這是遠編譯器知道是一個指向結構體的指針。 id只有一個成員(isa),並聲明沒有屬性,因此試圖將它用作對象是編譯時錯誤。只需將Subscripting的結果轉換爲要發送消息的對象的類型即可。

((Wall *)walls[0]).pos = CGPointMake(0, 0); //Does work 
+0

優秀的解釋,謝謝! – Tumtum

0

當你寫walls[0],您訪問數組的對象,但你「不知道」是什麼。因此,與((Wall*)walls[0]).pos

0

投它確保ü有進口

#import "Wall.h" 

,改變

walls[0].pos = CGPointMake(0, 0); 

((Wall *)walls[0]).pos = CGPointMake(0, 0);