2012-03-02 1 views
2

Я довольно новичок в объективе-c и задаюсь вопросом о прототипе ячеек.Ячейки прототипа с пользовательским классом не запускают init?

У меня есть табличный вид с пользовательскими ячейками, и он работает красиво.

Теперь у меня есть и в моем пользовательском классе клеток переопределен -(id)init и -(id)initWithStyle: reuseIdentifier:

Если я чек класса на клетку, это ясно из моего пользовательского класса, но ни один из методов инициализации когда-либо называется.

Поэтому он создает их для меня, но почему-то избегает стрельбы -(id)init, которая кажется мне странной.

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

Спасибо!

+0

Возможно ли, что он похож на мой класс моего пользовательского типа, потому что я конвертирую его, когда меня удаляют, а статическая строка в моем пользовательском классе работает, потому что это доступно даже без реального экземпляра? Я просто мозговой штурм :) Я могу опубликовать больше кода в понедельник. – Ostmeistro

ответ

18

Если это прототип ячейки из доски истории. - (id)initWithCoder: вызывается. Поэтому вам необходимо переопределить:

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
     //custom stuff here 
    } 

    return self; 
} 

Это верно для всего, что пробуждается от раскадровки.

+0

Я не могу продвигать вас, но это серьезно полезно, я не мог найти эту информацию нигде в документах или в сети, вы, вероятно, помогли сотням будущих путешественников :) – Ostmeistro

+0

Отлично! Счастлив, я мог бы помочь. – theVurt

+0

Серьезно неприятно то, что метод initWithStyle ... init обозначается как «Назначенный инициализатор» в соответствии с UITableViewCell.h. Жаль, что Objective C не имеет «правильных» конструкторов OO, таких как Java или C# и т. Д. –

0

метод следует использовать для инициализации пользовательской ячейки:

-(id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier{ 

    if(self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier]){ 

    } 
    return self;  
} 
+0

Разве это не устарело? Во всяком случае, это не сработало, тот же результат, что и переопределяющий init, ни один из них не запускается, но инициализируется строка const и может быть получена, поэтому он определенно является экземпляром класса, который никогда не прошел через какой-либо init. Спасибо ' – Ostmeistro

1

ли вы загрузить эти клетки из XIb? Если да, попробуйте вместо этого использовать awakeFromNib.

+0

Извините, нет, у меня есть стиль ячеек, определенный в файле раскадровки. Чтобы уточнить, теперь я устанавливаю текст в ячейках, передавая в свой объект данных ячейку. Так что в коде для ячейки у меня есть метод, который вызывается и он работает. Проблема в том, что я не могу переопределить initWithFrame или initWithStyle или даже инициализировать и поставить код там, потому что он никогда не срабатывает. Все ячейки создаются внутренне и таинственно, избегая init. Это не проблема, но я думаю, что это довольно странно. – Ostmeistro

+0

Для меня это был правильный ответ. Кроме того, это очень полезно, чем для ячейки, но также полезно для пользовательских представлений внутри ячейки. Такой пользовательский вид может работать только с раскадровки, если один из них отменяет метод awakeFromNib. Это потрясающе, спасибо! – naitoon