Я обновляю свой NSArray, который связан с NSTableView правильно? - PullRequest
1 голос
/ 15 января 2010

У меня довольно стандартная настройка, в которой в контроллере есть массив, который я привязываю к NSTableView. Когда я добавляю объект в этот массив с помощью пользовательского интерфейса, я добавляю элементы, копируя массив в изменяемый массив, добавляя содержимое, а затем копируя его обратно. Я где-то видел эту идиому, но я не совсем уверен, где и действительно ли это нормальное занятие. На Snow Leopard я отлично работаю, но на Leopard он очень сильно падает. GDB говорит мне, что это происходит прямо в отмеченной строке, куда я копирую новый массив обратно.

@interface MyAppDelegate : NSObject {

    NSArray * urls;
    //other declarations
}
@property (nonatomic, retain) NSArray *urls;


@implementation MyAppDelegate 

@synthesize urls;

- (void)addThing:(id)sender {

    NSMutableArray *newUrls = [NSMutableArray arrayWithArray: [self urls]];

    [newUrls addObject: newurlimadding];
    [self setUrls: [NSArray arrayWithArray: newUrl]]; 
}

Я почти уверен, что должен делать что-то сумасшедшее здесь. Есть лучший способ сделать это? Почему я рушусь?

Ответы [ 3 ]

1 голос
/ 17 января 2010
NSMutableArray *newUrls = [NSMutableArray arrayWithArray: [self urls]];
[newUrls addObject: newurlimadding];
[self setUrls: [NSArray arrayWithArray: newUrl]];

Для чего вы создали newUrls, если не установить его в качестве нового значения urls?

Кроме того, есть пара вещей, которые вы делаете неправильно:

  1. Нет объектов модели. Привязки ненавидят это. Если ваше табличное представление не существует исключительно для отображения различных частей URL (схема, хост, путь и т. Д.), Каждая в одном столбце, вы не дадите Bindings то, что ему нужно.

    Обратите внимание на поля в Инспекторе привязок. Обратите внимание, что их два: Ключ контроллера и Путь ключа модели. Это именно то, что они говорят на своих банках: Ключ контроллера - это ключ для свойства контроллера, который должен предоставлять объекты модели. Путь к ключу модели - это путь к ключу для одного или нескольких свойств в модели, которые обычно должны содержать объекты значений, такие как строки и числа.

    Возможно, вам нужно создать класс модели и сделать URL-адрес свойством этого класса. Я предполагаю, что у вас есть другие объекты, возможно, в параллельных массивах, которые вы можете перейти к свойствам класса модели. Сделайте это, чтобы вы работали с привязками вместо нее.

  2. Не используется метод доступа к массиву. Вы просто устанавливаете весь массив одновременно, что неэффективно и может вызвать проблемы с отображением (например, исчезновение выделенных участков). Реализуйте и используйте средства доступа к массиву для этого свойства массива. Accessorizer может помочь вам здесь.

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

Кроме того, поскольку тип urls может быть изменяемым, вы должны установить его на copy, а не retain.

0 голосов
/ 16 января 2010

Похоже, проблема была в том, что у меня были NSURL в качестве типа моего объекта.После того как я изменил объект в своем массиве на пользовательский объект, совместимый с KVC, больше не происходило сбоев.

Может быть, NSURL не совместим с KVC на 10.5, но на 10.6?1003 *

0 голосов
/ 15 января 2010

NSArray * вещи; - так как это может быть изменено, вы лучше представляете использование NSMutableArray вместо NSArray.

Когда вам нужно добавить какой-то новый элемент в список, просто используйте addObject и вставьте элемент в список.

Ваша привязка обеспечит обновление пользовательского интерфейса с помощью KVO и KVC.

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