Инициализировать пользовательский UITableViewCell - PullRequest
0 голосов
/ 06 мая 2011

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

UITableView dataSource должен вернуть ячейку из 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

Ответы [ 4 ]

11 голосов
/ 06 мая 2011

Хорошо.Это не то, как работает 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: ondataSource 'Таким образом, если tableView:numberOfRowsInSection: вернет 5, tableView:numberOfRowsInSection: будет вызвано пять раз (по одному разу для каждой отдельной строки).
  4. Ваша возможность настроить , как будет выглядеть эта ячейка после того, как вы получили пригодную для использования ячейку, но до того, как она будет возвращена (где «Этот текст появится в ячейке» отображается выше).Вы можете сделать довольно много здесь;Вы должны увидеть ссылку на класс для UITableViewCell, чтобы увидеть все, что вы можете сделать (все, что я сделал, это установил, чтобы он показывал «Этот текст ...»).Линии над позволяют iOS повторно использовать ячейки для повышения производительности.Например, если вы хотите показать определенную строку из массива строк, вы можете сделать это (обратите внимание на использование переменной indexPath): cell.textLabel.text = [someArrayYouHave objectAtIndex:indexPath.row];.
1 голос
/ 06 мая 2011

Вы писали:

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

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

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

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

0 голосов
/ 23 октября 2015

Новое решение 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
}
0 голосов
/ 06 мая 2011

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

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

То есть, вы получаете такую ​​ошибку

- (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;
}

Также см. Этот пост для загрузки пользовательских ячеек.

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