Использование кнопки для создания пользовательского экземпляра класса и отображения его в NSTableView
Я застрял в этой проблеме, и это сводит меня с ума. То, что я пытаюсь сделать, это нажать кнопку, создать экземпляр пользовательского класса, установить его переменные, добавить его в NSMutableArray
и отобразить его в виде таблицы. До сих пор кажется, что у меня все работает, кроме отображения информации в табличном представлении.
Мой пользовательский класс TradePaperback
только три NSString
свойства: title
, volume
, а также publisher
,
Вот код для моего заголовка и файлов реализации:
Заголовок:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (nonatomic, strong) NSMutableArray *tradeArray;
@property (weak) IBOutlet NSTableView *tableView;
- (IBAction)addTrade:(id)sender;
@end
файл реализации:
#import "AppDelegate.h"
#import "tradePaperback.h"
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end
@implementation AppDelegate
-(NSMutableArray *)tradeArray{
if (!_tradeArray){
_tradeArray = [[NSMutableArray alloc]init];
TradePaperback *avengers = [[TradePaperback alloc]init];
avengers.title = @"Avengers";
avengers.volume= @"volume 01";
avengers.publisher = @"Marvel Comics";
[_tradeArray addObject:avengers];}
return _tradeArray;}
- (IBAction)addTrade:(id)sender {
TradePaperback *newTrade = [[TradePaperback alloc]init];
newTrade.title = @"New Trade";
newTrade.volume = @"Volume Number";
newTrade.publisher = @"publisher";
[_tradeArray addObject:newTrade];
NSLog(@"added");
NSLog(@"number of items in array is %ld", _tradeArray.count);
[_tableView reloadData];}
@end
Мой табличный вид подключен с помощью привязок. Кажется, что все правильно подключено, так как avengers
экземпляр TadePaperback
то, что я вставил, появляется, когда я запускаю программу. Когда я нажимаю кнопку добавления, из журнала в консоли видно, что в массив добавлены элементы, но они просто не отображаются.
Зачем tableView показывать первый элемент в массиве, но не остальные?
Вот изображение программы после запуска и пару раз нажатия кнопки "Добавить".
Я был бы очень признателен за любую помощь или совет, который вы, ребята, могли бы дать. Заранее спасибо.
-Джек
1 ответ
Если вы используете привязки для заполнения табличного представления, вы почти наверняка используете NSArrayController
управлять содержимым таблицы. Если вы хотите добавить объект в массив, управляемый этим контроллером (ваш tradeArray
объект), вы должны сделать это косвенно: добавьте в контроллер массива, который, в свою очередь, обновит ваш массив. NSArrayController
предоставляет ряд add...
или же insert..
методы; решить, какой из них подходит вам лучше всего, и использовать его для замены вашего звонка [_tradeArray addObject:...]
,
Причина, по которой этот подход работает, а ваша - нет, заключается в том, что он задействует механизм кодирования / наблюдения значения ключа, который лежит в основе привязок. Ваш подход по существу добавляет объект за спиной контроллера массива - он не совместим с KVO / KVC, поэтому контроллер массива остается в неведении об изменении. Какао действительно предоставляет вам способ редактирования исходного массива в KVO/KVC-дружественной манере, если вы того пожелаете, это просто немного больше работы: попробуйте код ниже, а затем прочитайте Apple NSKeyValueCoding
Справочник по протоколу и руководство по программированию кодирования значения ключа для объяснения:
// Instead of [_tradeArray addObject:newTrade];
[[self mutableArrayValueForKey:@"_tradeArray"] addObject:newTrade];