未调用cellForRowAtIndexPath但调用了numberOfRowsInSection

时间:2014-01-29 14:34:59

标签: ios objective-c uitableview

我有一个简单的问题,但我无法理解是什么。 我有UIViewControler(称为RootController)加载UIView(称为SecondView),其中包含tableView。问题是UIView调用numberOfSectionsInTableViewnumberOfRowsInSection但不调用cellForRowAtIndexPath并且不显示表格视图。 RootViewController的代码是:

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60, self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];

SecondView的代码是:

@interface SecondView () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic,retain) UITableView *table;
@end

@implementation SecondView
@synthesize table;

- (id)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
   if (self) {
   self.table = [[UITableView alloc] init];
   self.table.delegate = self;
   self.table.dataSource = self;
   [self addSubview:self.table];
   }
 return self;
}

- (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];
     }
  cell.textLabel.text = @"Prova";
  return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   return 5;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
   return 1;
}
你可以帮我找到问题吗?谢谢。

9 个答案:

答案 0 :(得分:41)

您需要设置UITableView

的框架

答案 1 :(得分:10)

如果在另一个线程上调用reloadData,也会发生这种情况。确保它在主线程上运行,因为所有UI内容都必须在主线程上发生。

dispatch_async(dispatch_get_main_queue(),{
            self.myTableView.reloadData()
        });

答案 2 :(得分:9)

我的问题是我有一个简单的类来实现我的委托和数据源,但是简单类的生命周期太短了。

我在做

MyDataSourceClass* myClass = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = self.tableViewDataSource;
tableView.delegate = self.tableViewDataSource;
[tableView reloadData];

// end of function, myClass goes out of scope, and apparently tableView has a weak reference to it

需要做

self.tableDataSource = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = myClass;
tableView.delegate = myClass;
[tableView reloadData];
// now at the end of the function, tableDataSource is still alive, and the tableView will be able to query it.

请注意,上面的代码是来自内存的伪代码。从中获取“确保您的数据源/委托长寿”的概念,但不要复制粘贴它,因为您还需要做其他事情(比如设置框架等)。

答案 3 :(得分:6)

在XCode6中,当“#34;添加缺失约束”时,我发生了同样奇怪的问题。应用于故事板上的tableView以调整视图。

要在Storyboard上解决此问题,请首先清除约束:

enter image description here

然后以下列方式应用约束:

enter image description here

答案 4 :(得分:1)

您只能调用viewcontroller的视图 AFTER viewDidLoad。 您无法在init方法中与self.view进行交互

- (void)viewDidLoad {
    [super viewDidLoad];
    self.table = [[UITableView alloc] initWithFrame:self.view.bounds];
    self.table.delegate = self;
    self.table.dataSource = self;
    [self addSubview:self.table];
}

在您的情况下,您需要使用框架初始化您的tableview(如上面代码中的建议)。只需确保在viewController中的viewDidLoad中添加代码

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60,     self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];

答案 5 :(得分:1)

我和你一样有同样的问题:

我只有一个来自委托协议的方法被调用,这是 numberOfRowsInSection 。与此同时,我有第二种方法 cellForRowAtIndexPath 未被调用。

这种行为的原因是我的 numberOfRowsInSection 返回了0行而 cellForRowAtIndexPath 没有调用,因为它需要绘制0个单元格。

答案 6 :(得分:0)

我将对侯赛因·沙伯(Hussain Shabbir)的答案发表评论,以澄清该问题,但由于我尚无法发表评论,因此我将发布答案。

我有完全一样的问题。 numberOfRowsInSection会触发,但cellForRowAt不会触发。我将代码撕裂以寻找原因,但是原因不在代码中。

(对我来说)解决方案在情节提要中。我没有为表视图设置约束。 选择表格视图,单击“添加新约束”图标(看起来像方形的TIE战斗机),然后为顶部,底部,前导和尾随设置约束。然后将调用cellForRowAt,然后将填充您的表格。

我希望这对某人有帮助。

答案 7 :(得分:0)

此解决方案专门针对我的情况,但可能会对某人有所帮助。

我有同样的问题。我使用的是计算属性而不是存储属性;所以每次我调用tableView时,我都会得到一个新的。

我有以下代码:

var tableView: UITableView{
    let tableView = UITableView()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(SomeCell.self, forCellReuseIdentifier: cellID)
    return tableView
}

这是固定代码:

lazy var tableView: UITableView = {
    let tableView = UITableView()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(SomeCell.self, forCellReuseIdentifier: cellID)
    return tableView
}()

答案 8 :(得分:-2)

删除UITableView并再次添加到ViewController中