Действительно ли возможно разработать подклассы NSCell в Интерфейсном Разработчике?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

22
задан JJD 3 May 2011 в 15:37
поделиться

7 ответов

Вопрос был о подклассе NSCell; другие ответы, кажется, делают что-то еще, вероятно, используя в своих интересах UITableViewCell, являющийся представлением.

NSCell не является представлением. В то время как разметка пользовательской ячейки в IB была бы полезной вещью быть в состоянии сделать, я думаю, что ответ в основном "нет, это не возможно". При разделении на подклассы NSCell Вы в значительной степени просто делаете свой собственный рисунок. Нет подъячеек поддержки или параметризованной автоматической компоновки (пружины NSView's крыла и распорки), который является, я подозреваю то, что Вы ищете.

единственный протест состоит в том, что Вы могли разработать подкласс NSCell, который сделал , делают расположение подэлементов и обеспеченных параметров для установки тех подэлементов и всех tweakable параметров. Затем необходимо было бы записать плагин IB для предоставления доступа к той ячейке и сопроводительному инспектору доступными во время проектирования в IB.

Это, однако, вероятно, более твердо, чем запись небольшого пользовательского приложения, которое делает более или менее то же самое. Поместите NSCell в управление посреди окна и сделайте себя UI для тонкой настройки параметров, которыми Вы интересуетесь. Привязка может сделать это довольно простым для расположения материала (т.е. связать значение x с ползунком), хотя Вы не получите непосредственное управление элементами, конечно. Когда Вы сделаны, Вы могли заархивировать свою ячейку и загрузить архив во времени выполнения в Вашем реальном приложении, или Вы могли просто выйти из системы свойства и установить их в коде в Вашем приложении.

11
ответ дан Ken 29 November 2019 в 05:01
поделиться

Как Ken говорит, NSCells и NSViews отличаются, и можно только разметить NSView иерархии в NIB, не NSCells (которые не имеют никакой явной иерархии).

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

В этом случае, с помощью NIB работал бы, хотя он походит на тонну стычки. Обычно я только что заменил объект, который берет NSCells с пользовательским, который берет мой NSViews, но это означает писать Ваш собственный обрабатывающий мышь код, который очень раздражителен.

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

7
ответ дан Jason Plank 29 November 2019 в 05:01
поделиться

В IB запустите пустой XIB. Теперь перейдите к pallete и притяните двойной щелчок UITableViewCell, чтобы поднять и отредактировать.

включают только пользовательский UITableViewCell (никакой другой UIViews, или другие высокоуровневые средства управления) - удостоверяются, что это - реальный UITableViewCell в IB, или Вы не можете установить идентификатор повторного использования (в противоположность кастингу UIView в IB как Ваш пользовательский класс UITableViewCell). Тогда можно добавить маркировки или независимо от того, что Вы любите в ячейке, а также установке идентификатора повторного использования или устанавливаете любой индикатор раскрытия, который Вы могли бы любить.

Для использования Вы обеспечиваете код как это в tableView:cellForRow:atIndexPath: метод:

YourCustomCellClass *cell = (YourCustomCellClass *)[tableView dequeueReusableCellWithIdentifier:<IDYouSetInXIBFile>];
if ( cell == nil )
{
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:<YourXIBName> owner:self options:nil];
    id firstObject = [topLevelObjects objectAtIndex:0];
    if ( [ firstObject isKindOfClass:[UITableViewCell class]] )
        cell = firstObject; 
    else cell = [topLevelObjects objectAtIndex:1];
}

, Если у Вас есть какие-либо маркировки или другие средства управления, Вы хотите сослаться в своем коде, соединить их проводом в IB к Вашему пользовательскому классу ячейки - НЕ владелец файла, который Вы никогда не должны устанавливать использование вышеупомянутого кода (можно оставить его как NSObject).

Редактирование: Я отмечаю, что Вы действительно ищете ответ NSCell, но подход кода к использованию IB должен быть идентичным в Какао с Сенсорным кодом Какао, который я использовал выше, поскольку loadNibNamed является стандартным вызовом Какао.

5
ответ дан Kendall Helmstetter Gelner 29 November 2019 в 05:01
поделиться

Joar Wingfors написал статью для Пошаговый несколько лет назад на связанную тему, Подпредставления в строках TableView .

основная техника должна создать NSCell, который может разместить NSView. Если бы необходимо было сделать это, Вы могли бы тогда разработать подкласс NSView в Интерфейсном Разработчике, которого Вы могли встроить где угодно, Вам нужна та определенная ячейка.

Другая возможность, если можно быть нацелены на Leopard, состоит в том, чтобы видеть, необходимо ли использовать NSTableView или можно ли использовать NSCollectionView. Представления набора имеют дело непосредственно с точки зрения "представлений объекта", а не в ячейках, таким образом, они намного более просты для разработки в Интерфейсном Разработчике.

2
ответ дан Chris Hanson 29 November 2019 в 05:01
поделиться

Я делаю это как это:

/* example of a silly way to load a UITableViewCell from a standalone nib */

+ (CEntryTableViewCell *)cell
{
// TODO -- this is really silly.
NSArray *theObjects = [[NSBundle mainBundle] loadNibNamed:@"EntryTableViewCell" owner:self options:NULL];
for (id theObject in theObjects)
    if ([theObject isKindOfClass:self])
        return(theObject);
NSAssert(NO, @"Could not find object of class CEntryTableViewCell in nib");
return(NULL);
}

Однако не очень эффективно и если Вы загружаете партию данных, это могло бы причинить Вам боль. Конечно, необходимо использовать reuseIdentifier, который должен вынудить этот код только работать несколько разы на таблицу.

0
ответ дан schwa 29 November 2019 в 05:01
поделиться

Добавьте Ваш UITableViewCell к Вашему tableviewcontroller и объявите IBOutlet свойство:

@interface KuguTableViewController : UITableViewController {
    IBOutlet UITableViewCell *customTypeCell;
}

@property (readonly)  UITableViewCell *customTypeCell;

... тогда в cellForRowAtIndexPath можно просто использовать ячейку и установить ее, чтобы быть снова использованными:

static NSString *CellIdentifier = @"CustomCell"
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
        cell = customTypeCell;
        cell.reuseIdentifier = CellIdentifier;
-1
ответ дан Jason Plank 29 November 2019 в 05:01
поделиться

Некоторые ответы в этой теме отклонились от темы, потому что они говорят о Cocoa Touch, в то время как первоначальный вопрос был о Cocoa - эти два API совершенно разные в этом отношении, и Cocoa Touch делает это проще, потому что UITableViewCell является подклассом представления. NSCell - нет, и в этом проблема

Для справки, недавно мне пришлось делать что-то очень похожее в NSOutlineView - что в принципе то же самое, но немного сложнее, если что, потому что вам придется иметь дело с раскрытием / свертыванием уровней. Если вам интересен код, я писал об этом здесь: http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/

HTH

11
ответ дан 29 November 2019 в 05:01
поделиться