尽管cellForRowAtIndexPath返回有效的单元格

时间:2016-08-29 08:59:52

标签: ios objective-c uitableview uiviewcontroller

我在更改视图控制器时遇到了一些崩溃问题 - 基本上我有一个VC从用户那里获取数据进行搜索 - 然后它会调出一个带有搜索结果的新VC,显示在UITableView(不使用UITableViewController,只是普通UIViewController内的TableView)

崩溃日志:

  
    

2016-08-29 20:48:03.950 MyApp [2596:60877] ***断言失败 - [SearchResultsTable _configureCellForDisplay:forIndexPath:],/ BuildRoot / Library / Cache / com.apple.xbs / Source / UIKit_Sim /UIKit-3512.60.7/UITableView.m:7971

         

2016-08-29 20:48:03.961 MyApp [2596:60877]由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:' UITableView(; layer =; contentOffset:{0 ,0}; contentSize:{375,1128}>)无法从其dataSource获取单元格(; layer =; contentOffset:{0,0}; contentSize:{0,0}>)'     ***首先抛出调用堆栈:

  

我已经读过这个问题是由于你的cellForRowAtIndexPath函数中没有返回一个单元格引起的,但我肯定我的实现会成功返回一个单元格。 (我在其他地方测试了函数的代码,cell确实有一个值,并且不是nil。)

代码:

@property searchResultCell * cell;

-(UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

     _cell = [self dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    if (_cell == nil)
    {
        _cell = [[searchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    [[_cell txtDate] setText:@"test"];
    return _cell;
}

虽然正确设置了UITableView类,委托和dataSource,但是在放置了一些断点之后,似乎永远都不会执行这部分代码。

搜索结果VC的viewDidLoad([self SpecifiedSerial]先前在segue发生之前设置。它是NSString*):

- (void)viewDidLoad
{
    [super viewDidLoad];

_SearchResultsTableDelegate = [[searchResultsTable alloc] init:[self specifiedSerial]];

[[self SearchResultsTable] setDelegate:_SearchResultsTableDelegate];
[[self SearchResultsTable] setDataSource:_SearchResultsTableDelegate];
}

声明:

@property (weak, nonatomic) IBOutlet UITableView *SearchResultsTable;
@property searchResultsTable * SearchResultsTableDelegate;

如果有人能指出我在这方面的正确方向,我们将非常感激!

3 个答案:

答案 0 :(得分:2)

使用此代码:

-(UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     _cell = [self dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

而不是:

numberOfRowsInSection

修改

您的numberOfSectionsInTableView-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [[self searchedTrainSightings] count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { _cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath]; if (_cell == nil) { _cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } [[_cell textLabel] setText:@"test"]; return _cell; } 似乎不正确。

试试这段代码:

                           C21 C22  C23 C41 C42 C43 T21 T22 T23 T41 T42 T43
ENSG00000000003        660  451 493 355 495 444 743 259 422 204 149 623

ENSG00000000005           0 0   0   0   0   0   0   0   0   0   0   0

ENSG00000000419         978 928 1161 641 810807 1265 361 998 326 239 1055

ENSG00000000457        234 248 444  192 218 326 615 122 395 134 100 406

ENSG00000000460    1096 919 1253 693 907 1185 1648 381 1119 422 269 1267

答案 1 :(得分:1)

可能原因是你从cellForRowAtIndexPath方法返回nil并且无法使可重用单元出列。

使用代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    searchResultCell *cell; 
    cell = (searchResultCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil){
        cell = [[searchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    [[_cell txtDate] setText:@"test"];
    return cell;
}

只需配置您的单元格,使用storyboard 查看图片选择提供cell标识符的自定义单元格。 enter image description here

希望它有所帮助。

答案 2 :(得分:0)

我严重怀疑你正在使用的委托方法。我见过这个版本的cellForRowAtIndexPath方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

试试这个

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    _cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    if (_cell == nil)
    {
        _cell = [[searchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    [[_cell txtDate] setText:@"test"];
    return _cell;
}