dequeueReusableCellWithIdentifier возвращает ноль, используя статические ячейки раскадровки - PullRequest
9 голосов
/ 15 ноября 2011

У меня чертовски много времени с этим. Используя раскадровку, я создал контроллер табличного представления со статической ячейкой, которая содержит UITextField для пользовательского ввода. Когда пользователь закончит, я хочу получить содержимое текстового поля.

Вот что я сделал:

  • Создан подкласс UITableViewCell с именем SingleLineFieldTableViewCell
  • Добавил IBOutlet UITextField *textField; к подклассу, объявил его как свойство (неатомное, сохраняющее) и синтезировал его.
  • Добавлен IBOutlet SingleLineFieldTableViewCell *cellNamed; к контроллеру табличного представления-владельца, объявлен как свойство (неатомное, сохранено) и синтезирован.

  • В раскадровке у меня есть контроллер табличного представления со статическими ячейками. Одна из ячеек - это пользовательская ячейка, которая объявлена ​​как SingleLineFieldTableViewCell и имеет UITextField. Ему также присваивается идентификатор ячейки.

  • Я прикрепил ссылки на выходы ячейки табличного представления и текстовое поле к соответствующим IBOutlets, перечисленным выше.

Когда я бегу, dequeueReusableCellWithIdentifier возвращает nil. Я думал, что с Xcode 4 и раскадровками, dequeueReusableCellWithIdentifier, согласно Преобразование в раскадровки Примечания к выпуску , «Метод dequeueReusableCellWithIdentifier: гарантированно возвращает ячейку (при условии, что вы определили ячейку с заданным идентификатор)".

Странная часть в том, что когда я запускаю в Simulatior, таблица выглядит так, как ожидалось (раздел, размер ячейки и т. Д.), За исключением того, что я не могу редактировать пользовательскую ячейку.

Я в растерянности. Любая помощь или идеи?

- Джон

Ответы [ 5 ]

6 голосов
/ 06 февраля 2013

Я знаю, что этот вопрос был год назад, но сегодня я сам прошел через эту проблему.

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

См. Документы Apple: http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/TableViewCells/TableViewCells.html

По сути, идея заключается в том, что если вы используете статические ячейки, тогда нет необходимости использовать

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

метод источника данных, вместо этого просто генерируйте выходы для всех ваших элементов пользовательского интерфейса (внутри статических ячеек) и устанавливайте их напрямую.

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

3 голосов
/ 15 ноября 2011

Вы строите для iOS 5 или 4?

Если вы пробуете с 4.x, он не завершится с ошибкой, так как метод действителен, но не возвращает ячейку.У меня не было проблем с настройкой пользовательских классов.вот весь мой метод:

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

    GameDetailCell* cell=[tableView dequeueReusableCellWithIdentifier:@"gameCell"];
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

моя раскадровка выглядит так: Storyboard for cell

0 голосов
/ 10 июля 2013

В соответствии с документами Apple (заполнение статической табличной таблицы данными) http://developer.apple.com/library/ios/documentation/userexperience/conceptual/tableview_iphone/CreateConfigureTableView/CreateConfigureTableView.html#//apple_ref/doc/uid/TP40007451-CH6-SW31

Примечание: Если табличное представление в раскадровке статическое, пользовательский подклассUITableViewController, содержащая табличное представление, не должно реализовывать протокол источника данных.Вместо этого контроллер табличного представления должен использовать свой метод viewDidLoad для заполнения данных табличного представления.

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


Необязательно:

Однако, если ваш View Controller также является источником данных для других динамических табличных представлений и вам все еще нужны эти методы, можно вызывать толькосоответствующие методы super источника данных для статического табличного представления:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Static Table View
    if (tableView == self.tableView)
        return [super numberOfSectionsInTableView:tableView];

    // Dynamic Table View
    // ...
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Static Table View
    if (tableView == self.tableView)
        return [super tableView:tableView numberOfRowsInSection:section];

    // Dynamic Table View
    // ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Static Table View
    if (tableView == self.tableView)
        return [super tableView:tableView cellForRowAtIndexPath:indexPath];

    // Dynamic Table View
    // ...
}
0 голосов
/ 15 ноября 2011

Я тоже новичок, так что это может быть полная чушь, но я бы сказал UITextLabel, чтобы он вызвал один из моих методов, когда пользователь закончил редактирование и не беспокоился о попытке удалить его из табличного представления:

- (IBAction)userFinishedEditing:(id)sender
{
    ...
}

- (void) someMethod
{
    ...

    UITextLabel *label = ...;
    [label addTarget:self action:@selector(userFinishedEditing:sender:) forControlEvents: 
UIControlEventEditingDidEnd];

    ...
}
0 голосов
/ 15 ноября 2011
    Alert.m Class in which we used custom cell..

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

        static NSString *CellIdentifier = @"mycell";
        AlertCustomCell *cell = (AlertCustomCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) 
        {   
            cell=[[[AlertCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }


    cell.lAlert.text=[[alertArray objectAtIndex:indexPath.section] objectForKey:@"alertName"];
        cell.lblDate.text=[[alertArray objectAtIndex:indexPath.section] objectForKey:@"date"];


        UIImageView*imgview=[[UIImageView alloc]initWithFrame:CGRectMake(-28, 0, 275, 60)];
        imgview.image=[UIImage imageNamed:@"strip_s14.png" ];
        UIImageView*selimgview=[[UIImageView alloc]initWithFrame:CGRectMake(-28, 0, 275, 60)];
        selimgview.image=[UIImage imageNamed:@"strip_s14_h.png" ];
        [cell setSelectedBackgroundView:selimgview];
        cell.backgroundView = imgview;

        cell.backgroundColor=[UIColor clearColor];

        return cell;
    }

AlertCustomCell.m

#import "AlertCustomCell.h"


@implementation AlertCustomCell
@synthesize lblAlert,lblDate;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        Alert=[[UITextField alloc]initWithFrame:CGRectMake(10, 18, 80, 21)];
        Alert.backgroundColor=[UIColor clearColor];
        Alert.text=@"Alert 1";
        Alert.font=[UIFont fontWithName:@"Arial-BoldMT" size:15.0];
        [self.contentView addSubview:lblAlert];

        lblDate=[[UILabel alloc]initWithFrame:CGRectMake(70, 18, 150, 21)];
        lblDate.backgroundColor=[UIColor clearColor];
        lblDate.text=@"july 12,2011 4:17 PM";
        lblDate.font=[UIFont fontWithName:@"ArialMT" size:15.0];
        [self.contentView addSubview:lblDate];
    }
    return self;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...