Инициализировать пользовательский UITableViewCell

Я пытаюсь загрузить одну настраиваемую ячейку в UITableView, но все равно выдает ошибку

Источник данных UITableView должен возвращать ячейку из tableView: cellForRowAtIndexPath:

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

#import "RegisterDeviceViewController.h"


@implementation RegisterDeviceViewController

@synthesize checkString;
@synthesize cellRegistration;

// The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization.
    }
    return self;
}
*/


//Change UITableView Style to Grouped
- (id)initWithStyle:(UITableViewStyle)style {
    // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
    style = UITableViewStyleGrouped;
    if (self = [super initWithStyle:style]) {
    }
    return self;
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    self.title = @"Registration";
    [super viewDidLoad];
}


// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    return 1;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return 1;
}


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

    if (indexPath.section == 1) {
        if (indexPath.row == 1) {
            return cellRegistration;

        }
    }
    return nil;
}


//Pass search type over to rootViewController section2
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{

    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     [detailViewController release];
     */
}

/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}


@end

person tinhead    schedule 06.05.2011    source источник
comment
CellRegistration - это UITableViewCell, который я создал, а затем связал с настраиваемой ячейкой tableview в построителе интерфейса.   -  person tinhead    schedule 06.05.2011


Ответы (4)


Хорошо. Так работает UITableView. Когда в табличном представлении необходимо нарисовать ячейку (т. Е. Строку); он вызывает tableView:cellForRowAtIndexPath: для объекта, указанного в свойстве dataSource. Ваша задача - вернуть UITableViewCell из этого метода. Вот как это делает Apple (и как вы должны это делать):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AnIdentifierString"];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"AnIdentifierString"] autorelease];
    }

    cell.textLabel.text = @"This text will appear in the cell";


    return cell;
}

Количество вызовов этого метода зависит от количества разделов в табличном представлении и количества строк в каждом разделе. Процесс работает так:

  1. Представление таблицы вызывает метод делегата numberOfSectionsInTableView: для своего dataSource (он знает, что реализует этот метод, потому что dataSource должен придерживаться протокола UITableViewDataSource).
  2. Если numberOfSectionsInTableView: возвращает число больше нуля, табличное представление вызовет метод делегата tableView:numberOfRowsInSection: на dataSource. Поэтому, если numberOfSectionsInTableView: возвращает 2, tableView:numberOfRowsInSection: будет вызываться дважды.
  3. Если каждый вызов tableView:numberOfRowsInSection: возвращает число больше нуля, табличное представление будет вызывать метод делегата tableView:cellForRowAtIndexPath: на dataSource 'Таким образом, если tableView:numberOfRowsInSection: возвращает 5, tableView:numberOfRowsInSection: будет вызываться пять раз (один раз для каждой отдельной строки).
  4. У вас есть возможность настроить внешний вид этой ячейки после того, как вы получили пригодную для использования ячейку, но до ее возврата (где «Этот текст появится в ячейке» отображается выше). Здесь можно сделать довольно много; вы должны увидеть ссылку на класс для UITableViewCell, чтобы увидеть все, что вы можете делать (все, что я сделал, это установил его так, чтобы он отображал «Этот текст ...»). Строки выше позволяют iOS повторно использовать ячейки для повышения производительности. Если вы, например, хотите показать определенную строку из массива строк, вы можете сделать это (обратите внимание на использование переменной indexPath): cell.textLabel.text = [someArrayYouHave objectAtIndex:indexPath.row];.
person Alan Zeino    schedule 06.05.2011
comment
Вопрос, скажите, если бы у меня была собственная пользовательская ячейка, как я мог бы загрузить ее в эту ячейку tableview? - person tinhead; 06.05.2011
comment
Спасибо, я только что прочитал UITableViewCell, но все еще не уверен. Думаю, у меня будет перерыв, и я вернусь к этому ... но, по крайней мере, у меня нет ошибок. Спасибо. - person tinhead; 06.05.2011
comment
@Alan, я создал свою пользовательскую ячейку в построителе интерфейса, это изменит способ ее кодирования при попытке загрузить ее в tableviewcell. - person tinhead; 06.05.2011
comment
Пользовательская ячейка в Интерфейсном Разработчике может быть сделана в коде точно так же. Вам просто нужно будет сделать это программно: jainmarket. blogspot.com/2009/05/ - person Alan Zeino; 06.05.2011
comment
@Alan Zeino @tinhead спрашивал не об этом. Попробуйте следующее: @interface VIEW { CELL *holder; } @property (nonatomic, retain) IBOutlet CELL *holder; @end - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CELL *cell = (CELL *)[aTableView dequeueReusableCellWithIdentifier:@"id"]; if (nil == cell) { [[NSBundle mainBundle] loadNibNamed:@"NibName" owner:self options:nil]; cell = self.holder; self.holder = nil; } Не забудьте установить владельца файла в настраиваемой ячейке на тип настраиваемого табличного представления или класса делегата табличного представления. - person AWrightIV; 10.06.2011
comment
Боже, это некрасиво в комментарии. @tinhead Если вы зададите это как официальный вопрос и напишите мне, я дам вам более читаемый и полный ответ. - person AWrightIV; 10.06.2011

Вы написали:

он продолжает выдавать ошибку «UITableView dataSource должен возвращать ячейку из tableView: cellForRowAtIndexPath:» Но я понятия не имею, почему ...

Но ваш -tableView: cellForRowAtIndexPath: частично говорит:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//...
    return nil;
}

Прочитав сообщение об ошибке и посмотрев код, вы не заметили проблемы?

person Caleb    schedule 06.05.2011
comment
cellRegistration - это просто указатель. Если он не указывает на настоящую ячейку, вы получите эту ошибку. - person Caleb; 06.05.2011
comment
Я подключил его через InterfaceBuilder. - person tinhead; 06.05.2011

Вы возвращаете только один раздел, только одну строку

количество разделов и строк начинается с 0.

Thats y вы получаете такую ​​ошибку

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        if (indexPath.row == 0) {
               //this checking is no necessary, anyway if you want use like this
               //ensure that cellRegistration is UITableViewCell
            return cellRegistration;
        }
    }
    return nil;
}

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

person KingofBliss    schedule 06.05.2011
comment
Хорошо, что касается загрузки имени пера ... могу ли я создать новый перо с индивидуальной ячейкой для этого метода? - person tinhead; 06.05.2011
comment
Вот только я увидел ваш комментарий к CellRegistration. Проверьте мой отредактированный ответ. И проверьте, работает ли. - person KingofBliss; 06.05.2011

Новое решение iOS7 +, оптимизированное для более плавной прокрутки

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

Инициализация ячейки

Чтобы инициализировать ячейку, просто вызовите dequeueReusableCellWithIdentifier, и системы iOS7 + достаточно умны, чтобы обработать cell == nil или нет. Если во время вывода из очереди ячейка равна нулю, система автоматически создаст ячейку для вас.

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier" forIndexPath:indexPath];

    return cell;
}

Конфигурация ячейки

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

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    [self configureCell:cell forRowAtIndexPath:indexPath];
}

- (void)configureCell:(UITableViewCell *)cell
    forRowAtIndexPath:(NSIndexPath *)indexPath {

    // Configure your cell
}
person Bagrat Kirakosian    schedule 23.10.2015