表视图未填充

时间:2011-06-07 22:55:30

标签: iphone objective-c uitableview nsarray

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

我有一个数组中的文件,我想用它来填充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

其他方法是标准的。

我想我的问题在于我不能完全理解流程。

非常感谢任何帮助。提前谢谢。

5 个答案:

答案 0 :(得分:2)

您是否已将UIViewController子类设置为有问题的UITableView的delegatedataSource?如果不这样做,你所提到的方法都不会被调用。

答案 1 :(得分: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文件中显示所有代码。

答案 2 :(得分:0)

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

代替:matArray = [fileArray findUniqueItemsInArray:0 :[fileArray setFileToArray]];

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

答案 3 :(得分:0)

你使用过

吗?
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

return 1;
}

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

return [self.matArray count];
}

答案 4 :(得分:0)

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

@interface YourViewController : UIViewController <UITableViewDelegate> {

}

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

  1. 双击.xib文件,使其在界面构建器中打开。
  2. 左键单击您的tableview一次,使其突出显示为蓝色
  3. 现在右键点击你的桌面视图,然后会弹出一个菜单。
  4. 拖动数据源&amp;委托给文件所有者框。
  5. 确保在界面构建器中保存更改。
  6. 这应该“连接”使其运作所需的所有部分。

    快乐编码!!