表视图未填充

Posted

技术标签:

【中文标题】表视图未填充【英文标题】:Table View not populating 【发布时间】:2011-06-07 22:55:30 【问题描述】:

我知道这是一个经常被问到的问题/问题。针对我的问题,我查看了一堆问答,但我想我有点厚,因为我在任何地方都没有看到答案。

我有一个包含在数组中的文件,我想用它来填充 tableView。

问题是它没有被调用。 numberOfRowsInSection 或 numberOfSectionsInTableView 都不是。据我所知,只调用了 viewDidLoad。

我有 1 个部分,我的数组中的元素数等于 3(而不是 nil)。

相关代码在这里...

- (void)viewDidLoad    
    [super viewDidLoad];
    FileControl *fileArray = [[FileControl alloc] init];
    matArray = [fileArray findUniqueItemsInArray:0 :[fileArray setFileToArray]];
    [fileArray release];
    NSLog(@"%i \n %@", [matArray count], matArray); // matArray is filled.
    NSLog(@"ViewDidLoad"); 

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    
    NSLog(@"CellForRowAtIndexPath");

    NSString *text = [matArray objectAtIndex:[indexPath row]];
    [[cell textLabel] setText:text];

    return cell; 

@interface MaterialTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> 

    IBOutlet UITableView *materialTableView;
    NSArray *matArray;



@property (nonatomic, retain) NSArray *matArray;

@end

其他方法都是标准的。

我想我的问题在于我对流程的理解不够好。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

viewDidLoad 方法调用[tableView reloadData]; 会导致表格视图更新吗? matArray 是 NSArray 类型;您正在将 FileControl 类型分配给 NSArray ?尝试更改其中任何一个。 【参考方案1】:

您是否将您的 UIViewController 子类设置为相关 UITableView 的 delegatedataSource?如果不这样做,您提到的任何方法都不会被调用。

【讨论】:

我只是添加了头文件代码。上面的(现在)是你的意思吗?如果是这样,那么在我的问题中就存在。 @GaleDragon,差不多。该代码只是声明您实现了适当的协议。它实际上并没有将任何特定的 UITableView 链接到您的控制器。如果您使用的是 .xib 文件,则需要将连接从 UITableView 的委托和数据源出口拖到文件所有者。在代码中,你也可以只说 self.tableView.delegate = self;和 self.tableView.datasource = self; 好的,我已将它们连接起来,但随后-[UIApplication tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x4b109b0 出现在main 中。这是什么意思? 看起来您没有将正确的对象设置为委托和数据源。我的猜测是您正在使用 MainWindow.xib 将 UITableView 放在那里。如果我对 MainWindow.xib 的看法是正确的,请确保连接不会指向 File's Owner,该 xib 文件是 UIApplication。 嗯,您是在设置主窗口 .xib,其中文件的所有者实际上是 UIApplication,而不是自定义 UIViewController 子类的实例吗?【参考方案2】:

我想您使用的是UITableViewController

如果您使用的是UITableView,它会稍微复杂一些(在这种情况下,您需要实现UITableViewDelegateUITableViewDataSource 协议)。 [更新] 这不是你的情况,你使用的是UITableViewController

将此行添加到 viewDidLoad 方法的末尾:

[self.tableView reloadData];  

或者移动这个:

FileControl *fileArray = [[FileControl alloc] init];
matArray = [fileArray findUniqueItemsInArray:0 :[fileArray setFileToArray]];
[fileArray release];

init 方法。您的 init 方法应如下所示:

- (id)initWithStyle:(UITableViewStyle)style 
    if ((self = [super initWithStyle:style])) 
        FileControl *fileArray = [[FileControl alloc] init];
        matArray = [fileArray findUniqueItemsInArray:0 :[fileArray setFileToArray]];
        [fileArray release];
        NSLog(@"%i \n %@", [matArray count], matArray); // matArray is filled.
        NSLog(@"ViewDidLoad");
    
    return self;

如果您在日志中没有看到任何消息,则表示您没有使用该方法来初始化您的对象。

请在 .m 和 .h 文件中显示您的所有代码。

【讨论】:

嗯。我确实将FileControl 部分移动到init 方法(并且我认为是initWithStyle),以及一个NSLog()。似乎甚至没有被调用。这是怎么回事? @GaleDragon 您需要确保使用该方法 (initWithStyle) 来初始化您的对象。【参考方案3】:

我有一个建议。只是试一试。在 - (void)viewDidLoad 中声明这个。

而不是:matArray = [fileArray findUniqueItemsInArray:0 :[fileArray setFileToArray]];

使用这个:matArray = [[NSArray alloc] initWithArray:[fileArray findUniqueItemsInArray:0 :[fileArray setFileToArray]]];

【讨论】:

那没有多大作用。不过谢谢! 如果你 NSLog this: matArray in this method 你会得到什么?- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath【参考方案4】:

你用了吗

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView


return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


return [self.matArray count];

【讨论】:

嗯,我把它改成了那个,但我没有注意到变化。不过感谢您的建议。【参考方案5】:

确保您已将 tableview 委托添加到您的 .h 文件中,如下所示。

@interface YourViewController : UIViewController <UITableViewDelegate> 


还要确保您已在界面构建器中连接了数据源和委托。 这样做:

    双击您的 .xib 文件,使其在界面生成器中打开。 在您的表格视图上单击鼠标左键一次,使其突出显示为蓝色 现在右键单击您的表格视图,应该会弹出一个菜单。 将数据源和委托拖到文件所有者框。 确保在界面生成器中保存更改。

这应该“连接”让它工作所需的所有部分。

编码愉快!!

【讨论】:

以上是关于表视图未填充的主要内容,如果未能解决你的问题,请参考以下文章

一个视图控制器中有两个表视图,一个表视图未显示

使用“锁定”截断/填充从 Oracle 中的视图填充表

在一个视图上使用不同数据填充多个表的最佳方法是啥? [关闭]

为 javaFx 表视图中的每一行动态填充组合框列表

如何使用 NSMutableArray 填充表视图

使用核心数据中的数组填充表视图