#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