2015-08-03 1 views
0

У меня есть NSArray Bind to Array Controller, контроллер массива снова привязывается к NSTableView.NSArray Обновление представления таблицы, привязанного к контроллеру массива

  • Массив, содержащий модели. Каждая модель имеет определенные атрибуты свойства, а некоторые имеют неопределенные ключевые атрибуты. Где бы я хотел был бы заменить через некоторое время или на какое-то событие.
  • У меня есть NSModifiedArray, который является подклассом NSArray.
  • NSModifiedArray имеет собственные методы addModifiedObject и removeModifiedObject.
  • Через некоторое время объекты в массиве должны заменить определенные объекты в событии, а когда я выполняю замену объекта в пользовательском классе (NSModifiedArray), Array Controller не обновляет представление таблицы.

Так как я могу обновить контроллер массива с вне делать вызов rearrangeObjects на NSArrayController но в пользовательском классе, что я сделал (NSModifiedArray Sub класс NSMutableArray). Мне просто интересно, как я могу позвонить KVO на это, если да, то как?

@interface NSModifiedArray : NSMutableArray 
@end 

@implementation NSModifiedArray 

/** Trying to replace the objects in an array **/ 
-(void)objectAtIndex:(NSUInteger)index withArray:(NSArray *)inArray 
{ 
    /* A Subset of array is passed to this method, if the index passed  contains a null value then replace with the subset passed. */ 
    if([[super objectAtIndex:index] isKindOfClass:[NSNull class]]) { 
     /* replace the subset, After successfull replace the instance of this class binded to array controller doesn't update in UI, So i'm unable to see the replaced objects on the UI, even its updated and replaced successfully. Keeping a break and doing NSLog will show me the replaced objects. */ 

     [self replaceObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(index,[inArray count])] withObjects:inArray]; 
    } 
} 
@end 
+0

Этот вопрос не очень ясен. Пожалуйста, покажите свой код или укажите другие примеры. –

+0

Добавлен код с примером –

ответ

0

Вы должны сделать свой метод часть категории.

Или создайте новый класс, обладающий свойством NSMutableArray.

Вы не хотите, чтобы подклассы NSMutableArray за то, что вы делаете, потому что есть много условий, вы не выполняющие не переопределяя реализацию по умолчанию методов, перечисленных в NSMutableArray reference и NSArray reference:

подклассы Примечание

Существует, как правило, мало оснований подкласса NSMutableArray. Класс отлично справляется с тем, что он предназначен для выполнения - поддерживает измененную упорядоченную коллекцию объектов. Но бывают ситуации, когда пользовательский объект NSArray может пригодиться. Вот несколько возможностей:

Изменение того, как NSMutableArray хранит элементы своей коллекции. Вы можете сделать это по соображениям производительности или для лучшей совместимости с устаревшим кодом.

Приобретение дополнительной информации о том, что происходит с коллекцией (например, сбор статистики).

Методы Переопределение

NSMutableArray определяет пять примитивных методов:

  • insertObject: atIndex:

  • removeObjectAtIndex:

  • AddObject:

  • removeLastObject

  • replaceObjectAtIndex: withObject:

В подклассе, необходимо переопределить все эти методы. Вы также должны переопределить примитивные методы класса NSArray.

В Документах NSArray, он продолжает:

Любой подкласс NSArray необходимо переопределить рассчитывать примитивные методы экземпляра и objectAtIndex :. Эти методы должны работать в хранилище резервных копий, которое вы предоставляете для элементов коллекции. В этом хранилище вы можете использовать статический массив, стандартный объект NSArray или какой-либо другой тип или механизм данных. Вы также можете переопределить, частично или полностью любой другой метод NSArray, для которого вы хотите предоставить альтернативную реализацию.

Возможно, вы захотите реализовать инициализатор для вашего подкласса, который подходит для хранилища резервных копий, которым управляет подкласс. Если вы это сделаете, ваш инициализатор должен вызывать один из назначенных инициализаторов класса NSArray, либо init, либо initWithObjects: count :. Класс NSArray использует протоколы NSCopying, NSMutableCopying и NSCoding; если вы хотите, чтобы экземпляры собственного пользовательского подкласса, созданного при копировании или кодировании, переопределяли методы в этих протоколах.

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

Альтернативы подклассов

Перед созданием пользовательского класса NSArray, исследовать NSPointerArray и соответствующий тип ядра Foundation, CFArray Reference. Поскольку NSArray и CFArray являются «беспошлинными мостами», вы можете заменить объект CFArray для объекта NSArray в вашем коде (с соответствующим литьем). Хотя они являются соответствующими типами, CFArray и NSArray не имеют одинаковых интерфейсов или реализаций, и иногда вы можете делать что-то с CFArray, что вы не можете легко сделать с NSArray. Например, CFArray предоставляет набор обратных вызовов, некоторые из которых предназначены для реализации пользовательского поведения keep-release. Если вы укажете NULL-реализации для этих обратных вызовов, вы можете легко получить не-сохраняющий массив.

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

Я думаю, что происходит с «класс кластера» вещи в том, что Apple, есть частные подклассы этих как __NSArrayI и __NSArrayM, которые имеют функциональные возможности вы должны повторить, так как вы не можете унаследовать эти частные подклассы.

+0

Спасибо, что он дает мне четкое изображение, что я должен использовать категорию для этого, но что, если я переопределяю «objectAtIndex», а затем заменяются элементы в массиве, которые также должны обновлять пользовательский интерфейс, который является связыванием с контроллером массива. Нужно ли мне вызывать метод setter для тех, чьи значения были заменены с использованием willChangeValueForKey и didChangeValueForKey? –

+0

Вы не «переопределяете» - ваш прототип метода не соответствует методу родного класса, поэтому я должен был предположить, что вы пытаетесь реализовать новый метод. – stevesliva

+0

Alrite, я переопределяю, так как нужны еще несколько манипуляций. –

Смежные вопросы