2009-10-22 66 views
5

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

我已经将UITableViewDataSource和UITableViewDelegate协议添加到UIViewController接口,并将UITableView的委托和数据源设置为viewDidLoad中的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; 
} 
+0

你可能想要发表一些代码 – coneybeare 2009-10-22 15:44:12

回答

4

在fillArrays,再创建一个视图控制器 - 但你永远不会做任何与它或它的观点,你永远不会看到这一观点。您绝对不会手动调用viewDidAppear,这会在显示视图控制器视图时自动发生(仅在导航控制器的上下文中)。

通常的流动是,创建视图控制器和任何添加视图作为当前视图的子视图中,或将其推经由导航控制器的新窗口。我很确定你的整个问题是,他们的表永远不会添加到任何人看到的视图中,所以表调用其他方法,但从不调用cellForRow,因为它的layoutSubviews代码根本不被调用。

+0

就是这样。我正在创建一个UIViewController的副本。我所要做的就是通过方法参数将引用传递给Data类。感谢大家在这里的第一个问题的帮助。 – azdev 2009-10-22 20:36:59

0

检查并确认的tableView委托和数据源都指向的viewController

0

我看不到代码现在有什么问题,你是否用断点验证过cellForRow永远不会到达(即使我看到你有一个日志语句)?

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

如果一切都失败了,从XCode模板创建一个新的表格视图控制器,并将你的调用放在那里 - 那么当它工作时,向后回溯到你的代码为什么没有。

此外,它会很高兴看到您的viewDidLoad设置代码(添加回答上面请)。

0

如果您将代理和数据源设置为viewDidLoad,那么这可能是您的错误的来源。你可以在init中设置数据源和委托吗?

+0

当我将UITableView代码从viewDidLoad移动到init时,不幸的是,甚至没有调用numberOfSectionsInTableView。 – azdev 2009-10-22 19:10:04

0

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

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

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

4

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

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

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

然后cellForRowAtIndexPath开始工作。

+0

不错,简单。我认为这就是肯德尔在上面所看到的,但这对我来说很有意义。谢谢! – 2012-03-14 00:53:47

4

对于谷歌的缘故:

如果tableView:numberOfRowsInSection回报不管出于什么原因tableView:cellForRowAtIndexPath不会被调用,因为没有行称之为零。

+0

对于在家中的其他人,请确保您确保您的布尔逻辑在'numberOfRowsInSection'中是正确的。我是一名经验丰富的iOS开发人员,我只是在过去的一个小时里试图弄清楚为什么我的单元格不显示:在长时间检查部分结束时,我的“else”条件是设置** rows = 0 **。 WOOF! – kyleturner 2013-01-29 07:38:25

0

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

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

它完美的作品当过我做删除或更新一些行的UITableView被reloded到我UIView。