Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Вопрос был о подклассе NSCell; другие ответы, кажется, делают что-то еще, вероятно, используя в своих интересах UITableViewCell, являющийся представлением.
NSCell не является представлением. В то время как разметка пользовательской ячейки в IB была бы полезной вещью быть в состоянии сделать, я думаю, что ответ в основном "нет, это не возможно". При разделении на подклассы NSCell Вы в значительной степени просто делаете свой собственный рисунок. Нет подъячеек поддержки или параметризованной автоматической компоновки (пружины NSView's крыла и распорки), который является, я подозреваю то, что Вы ищете.
единственный протест состоит в том, что Вы могли разработать подкласс NSCell, который сделал , делают расположение подэлементов и обеспеченных параметров для установки тех подэлементов и всех tweakable параметров. Затем необходимо было бы записать плагин IB для предоставления доступа к той ячейке и сопроводительному инспектору доступными во время проектирования в IB.
Это, однако, вероятно, более твердо, чем запись небольшого пользовательского приложения, которое делает более или менее то же самое. Поместите NSCell в управление посреди окна и сделайте себя UI для тонкой настройки параметров, которыми Вы интересуетесь. Привязка может сделать это довольно простым для расположения материала (т.е. связать значение x с ползунком), хотя Вы не получите непосредственное управление элементами, конечно. Когда Вы сделаны, Вы могли заархивировать свою ячейку и загрузить архив во времени выполнения в Вашем реальном приложении, или Вы могли просто выйти из системы свойства и установить их в коде в Вашем приложении.
Как Ken говорит, NSCells
и NSViews
отличаются, и можно только разметить NSView
иерархии в NIB, не NSCells
(которые не имеют никакой явной иерархии).
, С другой стороны, нет ничего препятствующего тому, чтобы Вы имели иерархию NSViews
и использовали это для рисования Вашего NSCell
- Вы могли добавить их как подпредставление родительского представления Вашей ячейки, сказать им отображать, и удалять их из окна, и никто не будет более мудрым.
В этом случае, с помощью NIB работал бы, хотя он походит на тонну стычки. Обычно я только что заменил объект, который берет NSCells
с пользовательским, который берет мой NSViews
, но это означает писать Ваш собственный обрабатывающий мышь код, который очень раздражителен.
, С другой стороны, мой подход позволяет Вам связать значения представлений в NIB, таким образом, Вы не должны делать никакой дополнительной работы, которая прохладна.
В 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 является стандартным вызовом Какао.
Joar Wingfors написал статью для Пошаговый несколько лет назад на связанную тему, Подпредставления в строках TableView .
основная техника должна создать NSCell, который может разместить NSView. Если бы необходимо было сделать это, Вы могли бы тогда разработать подкласс NSView в Интерфейсном Разработчике, которого Вы могли встроить где угодно, Вам нужна та определенная ячейка.
Другая возможность, если можно быть нацелены на Leopard, состоит в том, чтобы видеть, необходимо ли использовать NSTableView или можно ли использовать NSCollectionView. Представления набора имеют дело непосредственно с точки зрения "представлений объекта", а не в ячейках, таким образом, они намного более просты для разработки в Интерфейсном Разработчике.
Я делаю это как это:
/* 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, который должен вынудить этот код только работать несколько разы на таблицу.
Добавьте Ваш 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;
Некоторые ответы в этой теме отклонились от темы, потому что они говорят о 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