доступ к интерфейсу objective c

#iphone #objective-c

#iPhone #objective-c

Вопрос:

это мой первый интерфейс в файле.h.

 @interface EventRow : NSObject 
{
NSString *title;
NSString *photo;
NSString *description;

NSMutableArray *photoArray;
}
@property (nonatomic , retain) NSString *title;
@property (nonatomic , retain) NSString *photo;
@property (nonatomic , retain) NSString *description;

@property (nonatomic , retain) NSMutableArray *photoArray;

@end
  

в том же файле второй

 @interface PhotoRow : NSObject
{
//NSString *image;

NSMutableArray *imageArray;
}
@property (nonatomic , retain) NSMutableArray *imageArray;

@end
  

Теперь каждый объект «PhotoRow» с заполненным массивом (imageArray) сохраняется в массиве «photoArray» в объекте EventRow.

Теперь я хочу подсчитать общее количество элементов «imageArray» . Но возникает проблема с доступом к нему через объект EventRow.

есть предложения?

Спасибо..

Комментарии:

1. В чем проблема, с которой вы сталкиваетесь?

2. я думаю, это должно сработать. не могли бы вы, пожалуйста, поделиться кодом для подсчета общего количества элементов массива изображений..

3. Я создал объект EventRow и хочу подсчитать элемент imageArray

Ответ №1:

Для доступа к отдельным объектам в photoArray (eventRow является экземпляром EventRow

 [[eventRow photoArray] objectAtIndex: someIndex]; // I don't like dot notation!
  

или

 [eventRow.photoArray objectAtIndex: someIndex];
  

Для доступа к imageArray

 [[[eventRow photoArray] objectAtIndex: someIndex] imageArray];
  

или

 [eventRow.photoArray objectAtIndex: someIndex].imageArray;
  

Чтобы получить количество изображений для этого imageArray

 [[[[eventRow photoArray] objectAtIndex: someIndex] imageArray] count];
  

или

 [eventRow.photoArray objectAtIndex: someIndex].imageArray.count;
  

Если вы хотите подсчитать все изображения, вам понадобятся циклы, но вы можете использовать быстрое перечисление для упрощения

 size_t total = 0;
for (PhotoRow* photoRow in  [eventRow photoArray])
{
    total  = [[photoRow imageArray] count];
}
  

Однако я бы хотел, чтобы вы немного переосмыслили свой дизайн. Ваше раскрытие NSMutableArray в каждом классе нарушает инкапсуляцию. Как только вызывающий объект получает доступ к массиву, он может изменять внутреннее состояние PhotoRow или EventRow без ведома объекта об этом. Было бы лучше не использовать свойства NSMutableArray, а добавить методы для добавления изображений и photoRows непосредственно в PhotoRows и EventRows соответственно. Итак, например, ваш класс photoRow может иметь следующие методы:

 -(size_t) imageCount; // returns the result of sending -count to the internal array
-(NSImage*) imageAtIndex: (size_t) index; // returns the result of sending -objectAtIndex: to the underlying array
-(void) addImage: (NSImage*) newImage;
// etc
  

Комментарии:

1. спасибо за объяснение, но индекс берется из таблицы так много раз, что индекс выходит из связи….

2. 1: Хорошее переобучение инкапсуляции. Позволит ли отображение NSArray также вносить изменения, поскольку оно может быть приведено к NSMutableArray ? Очевидно, что если NSArray не было доступно только для чтения, то его можно было бы установить явно?

3. @FreeAsInBeer: Когда я писал немного об инкапсуляции, я действительно думал о том, чтобы добавить немного о раскрытии NSArray . Я думаю, что, вероятно, это было бы нормально. Обратите внимание, что предоставление NSArray , а затем просто возврат внутреннего NSMutableArray допустимо при условии, что вы знаете, что все вызывающие пользователи будут соблюдать контракт API. Это противоречит соглашениям Apple, если они этого не делают. developer.apple.com/library/ios/documentation/Cocoa/Conceptual /…

Ответ №2:

Если я вас правильно понял, ваша photoArray переменная в вашем EventRow классе содержит PhotoRow объекты. Вы можете подсчитать объекты в переменной PhotoRow s imageArray следующим образом:

 int someIndex = 0;
[((PhotoRow*)[myEventRow.photoArray objectAtIndex:someIndex]).imageArray count];
  

Комментарии:

1. я хочу подсчитать общий элемент imageArray через объект EventRow, например [[eventRow.photoArray imageArray]count]];

2. Используется -count для получения количества объектов в NSArray, а не -length .

3. @Jeremy: Спасибо. Пожалуй, слишком рано для кодирования. Кофеин еще не подействовал.

4. @maulik: Это должно сработать. Конечно, вам нужно будет знать индекс объекта, для которого вы хотите получить ImageArray .

5. @FreeAslnBeer: да, я сделал .. я получил индекс из indexPath.row .. это дает мне объект EventRow. Теперь я должен извлечь объект imageArray, который хранится в массиве photoArray