6
#import "AssignmentsViewController.h"
#import "Assignment.h"

@interface AssignmentsViewController ()

@property NSMutableArray *assignments;
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation AssignmentsViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    NSLog(@"viewDidLoad");
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.assignments = [[MySingleton sharedMySingleton] assignments];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
}

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"viewWillAppear");
    [self.tableView reloadData];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"cellForRowAtIndexPath");
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AssignmentCell"];
    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"AssignmentCell"];
    }
    cell.textLabel.text = [[self.assignments objectAtIndex:indexPath.row] title];
    return cell;
}

@end

加载 AssignmentsViewController 并且至少一个作业分配在 assignments 数组中时的控制台输出:

2013-11-06 18:55:09.396 Homework Planner[4756:70b] viewDidLoad
2013-11-06 18:55:09.403 Homework Planner[4756:70b] numberOfSectionsInTableView
2013-11-06 18:55:09.405 Homework Planner[4756:70b] numberOfRowsInSection
2013-11-06 18:55:09.408 Homework Planner[4756:70b] viewWillAppear
2013-11-06 18:55:09.409 Homework Planner[4756:70b] numberOfSectionsInTableView
2013-11-06 18:55:09.409 Homework Planner[4756:70b] numberOfRowsInSection

我正在制作一个显示用户家庭作业的应用程序。出于某种原因,从未调用 cellForRowAtIndexPath,即使我确定 assignments 数组中有一个作业分配对象。作业分配通过模态视图添加到数组中,我已经验证它们确实是由该过程添加的,并且在用户点击“取消”后,视图返回到此类定义的视图。当这种情况发生时,其他两个与 UITableView 相关的方法运行,但不是 cellForRowAtIndexPath。请帮我解决我遇到的这个问题。

4

4 回答 4

7

让我再贡献一个罪魁祸首:“内存管理问题”。

如果 TableView 的 DataSource 对象在 TableView 从中提取数据时没有保留(保留计数为零),那么令人惊讶的是,虽然 numberOfSections 和 numberOfRows 只是被调用,但 tableView:cellForRowAtIndexPath: 不会被调用

于 2013-12-13T03:18:11.137 回答
6

检查是否[self.assignments count]返回 0(检查是否self.assignmentsnil.

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

否则,我现在能想到的唯一其他原因是委托方法返回的高度为 0(如果你正在实现它,否则默认实现总是给出非零高度,所以在这种情况下没有问题。)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  CGFloat height = 0;
  // Some calculation to determine height of row/cell.

  return height;
}
于 2013-11-07T03:02:50.277 回答
1

如果没有调用 cellForRowAtIndexPath 是因为视图尚未在屏幕上呈现(未绘制),因此系统无法知道 Cell 或 UITableView 的大小。

要解决该问题,请确保在呈现视图后添加项目(并且尺寸已知)。如果在父视图中添加 UITableView 以构建复杂的屏幕,则可能会发生这种情况。

如果在init阶段不加载数据,可以在设置数据后调用reloadData。

例子:

OfferTableViewController * offerList = [[OfferTableViewController alloc] init];

// add the view in the parent view to make sure that the dimension are calculated
[fullSiteView.offersView addSubview: offerList.view]; 
offerList.delegate = self;
// Set the data
offerList.offers = product.offers;
// Force reload to render
[offerList.tableView reloadData];

此外,如果你覆盖 heightForRowAtIndexPath 确保它返回的东西 > 0

注意,即使 numberOfRowsInSection 和 numberOfSectionsInTableView 返回正确的项目数,如果表格的大小未知,系统也不会调用 cellForRowAtIndexPath

于 2014-11-05T00:45:36.060 回答
1

另一个问题可能是 tableview 本身的框架大小为 0 或不在屏幕上......

我被困了很久,一直在看numberOfRowsInSection:被调用和heightForRowAtIndexPath:被调用并返回一个硬编码值但cellForRowAtIndexPath:从未被调用的日志!

尝试注销 tableView 的框架,或在其上设置背景颜色以检查其在屏幕上的实际可见性。

于 2016-04-28T15:25:17.633 回答