2013-09-05 4 views
1

Я полный новичок в Objective c, и я пытаюсь завершить вызов в книге «Программирование iOS: большое руководство Nerd Ranch».Нет видимого @interface для [object] объявляет селектор [метод]

Я пытаюсь поставить объект под названием элемента (из класса BNRItem) в NSMutableArray называется подпунктов, который является частью объекта под названием контейнера (из класса BNRContainer, подкласс BNRItem с добавление NSMutableArray для хранения BNRItems). BNRItem отлично работает.

Код выглядит следующим образом:

BNRContainer.h

#import <Foundation/Foundation.h> 
#import "BNRItem.h" 

@interface BNRContainer : BNRItem 
{ 
NSMutableArray *subItems; 
} 

BNRContainer.m

- (id)init 
{ 
return [self initWithItemName:@"Container" 
       valueInDollars:0 
       serialNumber:@""]; 
} 

- (void)setSubItems:(BNRItem*)item 
{ 
[subItems addObject:item]; 
} 

main.m

#import <Foundation/Foundation.h> 
#import "BNRItem.h" 
#import "BNRContainer.h" 

int main(int argc, const char * argv[]) 
{ 

@autoreleasepool { 

    BNRItem *item = [[BNRItem alloc] init]; 

    BNRContainer *container = [[BNRContainer alloc] init]; 

    [container setSubItems:item] 

    } 

return 0; 
} 

В линии [Co ntainer setSubItems: пункт] я получаю ошибку: Нет видимых @interface для контейнера не объявляет setSubItems селекторных

Метода инкубационных setSubItems не полный кода (хотя другие сеттера делать, и работает отлично).

Я делаю что-то простое неправильно? Простое объяснение было бы очень оценено!

ответ

1

Update BNRContainer.h: (. Незнайка почему Фред удалил его ответ)

#import <Foundation/Foundation.h> 
#import "BNRItem.h" 

@interface BNRContainer : BNRItem 
{ 
    NSMutableArray *subItems; 
} 
- (void)setSubItems:(BNRItem*)item; 
@end 

+0

Я думаю, что он (Фред), возможно, слегка исказил вопрос (хотя его ответ был очень полезен для меня, тем не менее). Ваш ответ прекрасно решает проблему - я просто посмотрел что-то простое (объявив его в файле .h). Спасибо огромное! –

1

Для того, чтобы Xcode генерировал геттеры/сеттеры для subItems, вы должны фактически объявить свойство для него в своем интерфейсе. Что-то вроде этого:

#import <Foundation/Foundation.h> 
#import "BNRItem.h" 

@interface BNRContainer : BNRItem 
@property (strong, nonatomic) NSMutableArray *subItems; 
@end 

Кроме того, вы не всегда на самом деле Alloc/initing вашего массива и текущая логики setSubItems: не будет делать то, что это звучит, как он будет делать. Эта функция добавит массив, переданный как параметр в качестве объекта в SubItems. Если вы пытаетесь добавить элементы из массива в подразделы, то вы должны использовать:

[myMutableArray addObjectsFromArray:<#(NSArray *)#>]; 
+1

без явного '@synthesize subItems = subItems' свойство не будет использовать ivar. лучше избавиться от ivar полностью – Sebastian

+0

Собственно, все, что он должен сделать, это объявить setSubItems в своем .h. Не нужно использовать '@ propertyy' вообще. –

+0

Да, я не знаю, почему Фред удалил свой пост. –