Настройка NSTableView с NSMutableArray пользовательских классов в качестве источника данных - PullRequest
1 голос
/ 04 апреля 2011

Хорошо, я изучаю программирование в Objective-C и Cocoa, и я столкнулся с проблемой в проекте, над которым я работаю.Так что в моем коде у меня есть NSMutableArray (sources) объектов пользовательского класса.Каждый объект имеет имя NSString.Я пытаюсь получить табличное представление для отображения всех объектов в источниках по имени каждого объекта.

У меня есть класс делегата приложения, соответствующий протоколу NSTableViewDataSource, что означает наличие метода objectValueForTableColumn иМетод numberOfRowsInTableView.

В numberOfRowsInTableView у меня просто есть return [sources count];оператор, и он отлично работает.

В objectValueForTableColumn я возвращаю [[sources objectAtIndex: rowIndex] name] ;, но ничего не отображается.

Я добавил много операторов NSLog дляотладка, и я думаю, что я знаю, в чем проблема, но я не знаю, почему или как ее исправить.

Итак, внутри objectValueForTableColumn массив sources равен nil.Внутри, numberOfRowsInTableView, источники активны, и этот метод работает нормально.Теперь оба эти метода выполняются много раз, и каждый раз источники активны в numberOfRowsInTableView, но nil в objectValueForTableColumn.

Я заменил оператор return в objectValueForTableColumn тестовой строкой return @ "."; и он отображает правильное количество строк в табличном представлении.Из-за этого я знаю, что табличное представление настроено правильно, помимо проблемы, с которой я сталкиваюсь с источниками.

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

Спасибо, Алекс

редактировать:

- (void) loadFromFile
{
NSString *filePath = @"/Users/alex/opt/Wallify.plist";
NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: filePath])
{
    NSData *data = [[NSData new] initWithContentsOfFile: filePath];
    NSLog(@"Loaded data from file.");


    self.sources = [NSKeyedUnarchiver unarchiveObjectWithData: data];
    [data release];

    for ( ATImageSource *i in sources)
    {
        NSLog(@"retaining i");
        [i retain];
    }



    [sources retain];


    NSLog(@"&imgsrc: %p", sources);
    NSLog(@"imgsrc: %@", sources);
    NSLog(@"Name: %@",[[sources objectAtIndex: 0] name]);

}
else
{
    //  Saved settings file does not exist
    //  Load defaults

    self.sources = [[NSMutableArray alloc] initWithArray: nil];
    [self.sources retain];

    // new code to setup testfoldersrc
    ATFolderSource *f = [ATFolderSource new];
    f.name = @"Documents";
    f.source = @"/Users/alex/Documents/";
    f.localPath = @"/Users/alex/Documents/";
    f.type = @"f";

    [f populateArrayFromLocalPath];

    [self.sources addObject: f];
    [f release];

    // new code to setup testrsssrc
    ATRSSSource *r = [ATRSSSource new];
    r.name = @"NASA Large Image of the Day";
    r.source = @"http://www.nasa.gov/rss/lg_image_of_the_day.rss";
    r.localPath = @"/Users/alex/opt/nasa_lg_image_of_the_day/";
    r.type = @"r";

    [r getImagesFromRSS];
    [r populateArrayFromLocalPath];

    [self.sources addObject: r];
    [r release];
}

 }

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

Хорошо, так что я наконец-то понял, хотя я не совсем уверен, что понимаю это еще.Вы были правы в том, что это имело отношение к тому, что источники объявлялись слишком много раз, или что-то в этом роде.

Чтобы заставить его работать, мне нужно было изменить [собственные источники] на [[NSApp делегат] источники].Я считаю, что это гарантирует, что к нужным объектам источников обращаются.Я понимаю, что это, вероятно, плохая практика кодирования, и большинство уроков предлагают вместо этого использовать класс Singleton, но сейчас это работает, и я исправлю это позже.

Я не уверен, что изменения будутЯ сделал, чтобы файл XIB сделал разницу.У меня есть делегат приложения, связанный с табличным представлением как tableView, делегат и источник данных.По какой-то причине [self sources] внутри objectValueForTableColumn не ссылается на тот же исходный объект, что и [self sources], на любой другой метод, даже если все они находятся в объекте делегата приложения.

0 голосов
/ 04 апреля 2011

Я подозреваю, что это состояние гонки, при котором массив не заполняется должным образом до того, как NSTableView запросит данные дисплея, или что-то с ним заиграет.

В любом случае, возможно, есть лучший способ сделать это, используя NSArrayController. У Apple есть подробное руководство, которое может даже создавать под-массивы массива (представления Master / Detail). В основном это какая-то работа с указателями и щелчками, и, возможно, такая же продвинутая, как переопределение или два. Проверьте это в http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/Tasks/masterdetail.html.

Использование этого метода также должно обеспечивать такие вещи, как бесплатная сортировка и фильтрация, а также упрощает обслуживание (в зависимости от вашей точки зрения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...