Хранение экземпляров NSView в массиве - PullRequest
0 голосов
/ 04 августа 2011

Можно ли сохранить объект NSView в изменяемый массив?Насколько я понимаю, представление будет объектом, поэтому массив должен его содержать.В частности, я хочу хранить несколько экземпляров nib-файла, который, как мне кажется, будет загружен с инициализацией NSNib , а затем добавит в массив addObject.

Идея состоит в том, чтобы отображать NSView в каждой из строк столбца в TableView.Я думаю, что это можно сделать, потому что iTunes делает нечто подобное (с тем, что я считаю NSImage) при отображении обложек альбомов в виде списка.

Тем не менее, любые знания по этому вопросу (или ссылка на пример или учебник) будет очень признателен.

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

TableViews обычно не содержат NSView для каждого элемента.Они содержат несколько NSViewTableCells (которые по системе намного проще, чем NSView), и они повторно используют эти ячейки.У них обычно не намного больше ячеек, чем необходимо для отображения видимой части TableView, AFAIK, и когда представление прокручивается, ячейки, которые стали «невидимыми», используются повторно.

Так что лучший способ сделать это - создать подкласс ячейки и заставить TableView отображать содержимое, используя их.Использование NSViews для каждой записи в списке, скажем, моих MP3-альбомов было бы чрезвычайно дорого.

1 голос
/ 05 августа 2011

В Xcode перейдите в File-> New File и выберите класс Objective C, затем в раскрывающемся списке выберите его как подкласс UITableViewCell. Назовите его MyCell (например)

Далее в конструкторе интерфейсов создайте новый XIB и измените его владельца на вновь созданный класс. Вы также можете удалить вид по умолчанию и добавить UITableViewCell. Установите выходную точку представления владельца для этой новой ячейки таблицы. Затем добавьте все, что вы хотите, в UITableViewCell.

Затем создайте новый UIViewController (который может быть полезным для создания нового UITableViewController, а затем измените его тип на UIViewController, чтобы вы получили все добавленные для вас методы UITableViewDelegate) и выберите добавление файла XIB для UIViewController. Откройте файл заголовка для вновь созданного UIViewController и добавьте протокол UITableViewDelegate, чтобы заголовок мог выглядеть так:

@interface MyViewController: UIViewController <UITableViewDelegate, UITableViewDataSource>

В представлении для контроллера представления (в конструкторе интерфейсов) добавьте UITableView, а затем установите его источник данных и делегатов владельцу. Обязательно импортируйте файл заголовка MyCell.h. Затем реализуйте tableViewMethods, в частности, для вашего UITableViewCell, вы бы сделали что-то вроде этого:

       - (UITableViewCell *)tableView:(UITableView *) tableView
             cellForRowAtIndexPath:(NSIndexPath *) indexPath
    {
        static NSString *MyCellIdentifier = @"MyCellIdentifier";

        MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:MyCellIdentifier];
        if (cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];

            cell = [nib objectAtIndex:0];   
        }

    //Here you would set properties of the cells items like labels, etc.
return cell;
    }
...