表视图未填充
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 的 delegate
和 dataSource
?如果不这样做,您提到的任何方法都不会被调用。
【讨论】:
我只是添加了头文件代码。上面的(现在)是你的意思吗?如果是这样,那么在我的问题中就存在。 @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
,它会稍微复杂一些(在这种情况下,您需要实现UITableViewDelegate
、UITableViewDataSource
协议)。
[更新] 这不是你的情况,你使用的是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 文件,使其在界面生成器中打开。
在您的表格视图上单击鼠标左键一次,使其突出显示为蓝色
现在右键单击您的表格视图,应该会弹出一个菜单。
将数据源和委托拖到文件所有者框。
确保在界面生成器中保存更改。
这应该“连接”让它工作所需的所有部分。
编码愉快!!
【讨论】:
以上是关于表视图未填充的主要内容,如果未能解决你的问题,请参考以下文章