Использование кнопки для создания пользовательского экземпляра класса и отображения его в 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];
Другие вопросы по тегам