dequeueReusableCellWithIdentifier не возвращает ячейку моего пользовательского типа - PullRequest
5 голосов
/ 06 марта 2012

Я использую раскадровки ios5 с UITableViewController с подклассом UITableViewCell. Я не хочу проектировать визуальные элементы ячейки в конструкторе раскадровки для представления, потому что я хочу использовать повторно используемый подкласс UITableViewCell (в частности, TDBadgedCell ).

Я установил свой идентификатор ячейки в конструкторе раскадровок, и все строки правильно загружаются в UITableView, пока я не устанавливаю какие-либо свойства, уникальные для TDBadgedCell. Если я установлю свойство badgeString, которое уникально для TDBadgedCell, я получу исключение. Я сузил, что dequeueReusableCellWithIdentifier: не возвращает ячейку типа TDBadgedCell.

Я сталкиваюсь с этим только с помощью UITableViewController. У меня есть UIViewController со встроенным UITableView, настроенным таким же образом, и это не проблема. Есть идеи?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
static NSString *CellIdentifier = @"PhoneNumberCell";
TDBadgedCell *cell = (TDBadgedCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

if ([cell isKindOfClass:[TDBadgedCell class]])
{
    NSLog(@"It is TDBadgedCell");
}
else
    NSLog(@"It is NOT TDBadgedCell");

Ответы [ 3 ]

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

В раскадровке вы можете установить свойство Custom Class для подкласса UITablviewCell.
Затем метод dequeueReusableCellWithIdentifier вернет ячейку с типом вашего подкласса.

0 голосов
/ 13 июля 2015

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

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self.tblProfileInfo dequeueReusableCellWithIdentifier:@"PostCell" forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;

}

Вы забыли указать indexPath в конце.

0 голосов
/ 14 декабря 2012

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

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

У меня было два класса UITableViewCell, один с UITextView какэто и другое с UITextView, подклассами которого canBecomeFirstresponder, возвращающий NO.Таким образом, пользователь все еще может прокручивать вверх и вниз данные UITextview, но не копировать и вставлять данные.

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

ПОЧЕМУ?Потому что [self.tableview reloadData] не будет перестраивать ячейки с новым классом, поскольку ячейка еще существует.Новые ячейки вне экрана получат новый класс, а существующие - нет.Это решение восстанавливает все ячейки один раз после покупки, разблокируя добавленную функцию.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


if (your test if in-app was purchased is yes)
{
static NSString *MyIdentifier = @"MyCell";

FrontCell *cell = (FrontCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil)
        {
        cell = [[FrontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.shouldIndentWhileEditing = NO;
    }

//....///     

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row];
cell.trackDetails.delegate = self;
cell.trackDetails.tag = indexPath.row;


return cell;
}
else // inapp not purchased
{
    static NSString *MyLockedIdentifier = @"MyLockedCell";

    FrontCellLocked *cell = (FrontCellLocked *)[tableView dequeueReusableCellWithIdentifier:MyLockedIdentifier];

    if (cell == nil)
    {
        cell = [[FrontCellLocked alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyLockedIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.shouldIndentWhileEditing = NO;
    }

     //....///     

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row];
cell.trackDetails.delegate = self;
cell.trackDetails.tag = indexPath.row;


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