1

単一のカスタムセルをにロードしようとしています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

4 に答える 4

11

わかった。これは、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あるため、そのメソッドを実装していることがわかります)。dataSourceUITableViewDataSource
  2. numberOfSectionsInTableView:ゼロより大きい数値を返す場合、テーブルビューはでデリゲートメソッドtableView:numberOfRowsInSection:を呼び出しdataSourceます。したがって、numberOfSectionsInTableView:が返された場合2tableView:numberOfRowsInSection:は2回呼び出されます。
  3. の各呼び出しがtableView:numberOfRowsInSection:ゼロより大きい数を返す場合、テーブルビューは'のデリゲートメソッドを呼び出しtableView:cellForRowAtIndexPath:ます。dataSourceしたがって、tableView:numberOfRowsInSection:が返される場合5tableView:numberOfRowsInSection:は5回呼び出されます(個々の行ごとに1回)。
  4. そのセルの表示方法をカスタマイズする機会は、使用可能なセルを受け取った後、返される前です(「このテキストはセルに表示されます」が上に表示されます)。ここではかなり多くのことができます。UITableViewCellのクラスリファレンスを参照して、実行できるすべてのことを確認する必要があります(これまでに行ったのは、「このテキスト...」を表示するように設定することだけです)。上記の行は、iOSがパフォーマンスを考慮してセルを再利用する方法です。たとえば、文字列の配列から特定の文字列を表示したい場合は、これを行うことができます(indexPath変数の使用に注意してください)cell.textLabel.text = [someArrayYouHave objectAtIndex:indexPath.row];
于 2011-05-06T03:57:58.300 に答える
1

あなたが書いた:

「UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:」というエラーがスローされ続けますが、理由がわかりません..

しかし、あなたの -tableView:cellForRowAtIndexPath: は、部分的に次のように述べています。

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

エラー メッセージを読み、コードを確認した後、問題がわかりませんか?

于 2011-05-06T04:05:50.013 に答える
0

1つのセクション、1つの行のみを返しています

セクション数と行数は 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;
}

カスタムセルのロードについては、この投稿も参照してください。

于 2011-05-06T04:10:30.063 に答える