cellForRowAtIndexPath未被调用; sections返回1,rows返回4

时间:2009-10-22 15:10:42

标签: iphone objective-c cocoa-touch uitableview

在解析Data类中的JSON数据之后,我在同一Data类的fillArrays方法中设置了UIViewController的NSArray * headlines属性。在我的UIViewController的viewDidAppear方法中,我在UITableView上调用reloadData。 numberOfSectionsInTableView触发并返回1,然后numberOfRowsInSection触发并返回数组计数4(对于数组中的4个字符串)。但是,控制永远不会到达cellForRowAtIndexPath,而我最难理解为什么,特别是因为我有有效的部分和行。细胞都是可见的。

我已将UITableViewDataSource和UITableViewDelegate协议添加到UIViewController接口,并在viewDidLoad中将UITableView的委托和dataSource设置为self(这也通过调用的行和节计数方法进行验证)。

我想知道是否有一些东西可以重新初始化Data.m中的UIViewController以设置其属性。

在Data.m中:

- (void)fillArrays:(NSArray *)jsonObjs {
    NSLog(@"fillArrays");               
    HeadlinesRootViewController *hrvc = [[HeadlinesRootViewController alloc] init];
    hrvc.headlines = [self getJsonValuesForKey:@"headline" inArrayOfObjects:jsonObjs];
    [hrvc viewDidAppear:NO];
}

在ViewController.m中:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    // Table view
    headlineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 180, self.view.bounds.size.width, 300) style:UITableViewStylePlain];
    [headlineTableView setDelegate:self];
    [headlineTableView setDataSource:self];
    // Temporary
    self.headlines = [[NSMutableArray alloc] initWithObjects:@"headline1", @"headline2", @"headline3", @"headline4", nil];



    [self.view addSubview:headlineTableView];
    self.headlineTableView = headlineTableView;
    [headlineTableView release];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"viewdidappear");
    NSLog(@"headlines: %@", self.headlines); // Returns an array of 4 headlines
    if( [self.headlines count] != 0 ){
        [self.headlineTableView reloadData];
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"numberOfSectionsInTableView: 1");
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"numberOfRowsInSection: %d", [self.headlines count]);
    return [self.headlines count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"cellForRowAtIndexPath");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.text = [[NSString alloc] initWithFormat:@"%@", [self.headlines objectAtIndex:indexPath.row]];

    return cell;
}

9 个答案:

答案 0 :(得分:4)

在fillArrays中,您创建了另一个视图控制器 - 但是您从不对它或视图执行任何操作,您将永远不会看到该视图。您永远不会手动调用viewDidAppear,这会在显示视图控制器视图时自动发生(但仅在导航控制器的上下文中)。

通常情况下,您创建一个视图控制器并将该视图添加为当前视图的子视图,或者通过导航控制器将其作为新窗口推送。我很确定你的整个问题是他们的表永远不会被添加到任何人实际看到的视图中,因此该表调用其他方法但从不调用cellForRow,因为它的layoutSubviews代码根本就没有被调用。

答案 1 :(得分:4)

您是否已将tableView添加到UIViewController的视图中?

它发生在我身上,当我添加了这个

[self.view addSubview:table];
[table release];

然后cellForRowAtIndexPath开始工作。

答案 2 :(得分:4)

出于Google的考虑:

如果tableView:numberOfRowsInSection因任何原因返回零,tableView:cellForRowAtIndexPath将不会被调用,因为没有要调用它的行。

答案 3 :(得分:0)

检查以确保tableView委托和dataSource指向viewController

答案 4 :(得分:0)

我看不出代码有什么问题,你是否通过断点验证了CellForRow永远不会到达(即使我看到你有一个日志声明)?

另外,我会尝试进行健全性检查,在rowsInSection中显式返回“1”,并在cellForRow返回的单元格中对字符串进行硬编码。

如果所有其他方法都失败了,请从XCode模板创建一个新的表视图控制器并将您的调用放在那里 - 然后当它工作时,向后工作以解释您的代码没有的原因。

另外,最好看看你的viewDidLoad设置代码(请在上面添加回答)。

答案 5 :(得分:0)

如果你在viewDidLoad设置委托和数据源,那么这可能是你的bug的来源。你能在init中设置数据源和委托吗?

答案 6 :(得分:0)

我不确定您是否将UITableView作为子视图添加到UIViewController.view。无论如何,这是我的方法。

在这种方法中,我发现执行没有进入cellForRowAtIndexPath,直到我在将UITableView添加为子视图后将UIViewController.view发送到后面。

走到这一步只是问题的一部分。此时,我的其他视图控制器似乎不再响应触摸事件。我发现当我还将UITableView作为子视图添加到rootViewController时,我的所有视图都获得了适当的触摸事件。

答案 7 :(得分:0)

非常感谢pxl。当我将UITableView初始化从viewDidLoad移动到:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil"

当我删除或更新UITableView被重新下载到我的UIView的某些行时,它工作得很好。

答案 8 :(得分:0)

Swift 版本

添加self.table.layoutIfNeeded(),然后添加self.tableView.reloadData()