使用 Table 加载 UIView 时无法从其 dataSource 中获取单元格

Posted

技术标签:

【中文标题】使用 Table 加载 UIView 时无法从其 dataSource 中获取单元格【英文标题】:Failed to obtain a cell from its dataSource when loading UIView with Table 【发布时间】:2016-04-15 05:11:03 【问题描述】:

我有一个 ViewController,我在其中放置了另一个小的 UIView,其中我放置了一个 TableView,但不确定如何在此表中显示数组中的数据,任何帮助将不胜感激。我正在尝试使用以下代码加载表格:

-(void) animateResults 

_resultsLabel.text = [NSString stringWithFormat:@"You Scored %d", runningScore ];

resultsTable.delegate = self;
resultsTable.dataSource = self;
[self.resultsTable registerClass:[UITableViewCell self] forCellReuseIdentifier:@"resultsListCell"];
[self.resultsTable reloadData];
[self.view layoutIfNeeded];
[UIView animateWithDuration:0.3 animations:^
    _resultsView.frame = self.view.frame;

 completion:^(BOOL finished)

   NSLog(@"%@", questionsArray);

];


但现在我收到一个无法从其数据源获取单元格的消息。这是表格的代码

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
//Return number of sections
return 1;



//get number of rows by counting number of challenges
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section 
return questionsArray.count;



//setup cells in tableView
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
//setup cell
static NSString *CellIdentifier = @"resultsListCell";
resultsViewCell *cell = [tableView  dequeueReusableCellWithIdentifier:CellIdentifier];

NSDictionary *results = [questionsArray objectAtIndex:indexPath.row];

NSString *resultsName = [results objectForKey:@"answers"];

BOOL correct = [[results objectForKey:@"correct"] boolValue];

if (!correct) 
    cell.resultsIcon.image = [UIImage imageNamed:@"BlackIconLock.png"];


else
    cell.resultsIcon.image = nil;


cell.resultsName.text = resultsName;

return cell;

这是这个视图控制器的 .h

#import <UIKit/UIKit.h>
#import "Store.h"
#import "flags.h"
#import "Tribes.h"
#import "resultsViewCell.h"

@interface GamePlayViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>

NSMutableArray *questionsArray;
NSMutableArray *answersArray;
NSInteger gameSelected;
NSMutableArray *revealArray;
NSTimer *questionTimer;
BOOL GameInProgress;

int random;
int questionTimerCounter;
int loopCounter;
int runningScore;



@property (weak, nonatomic) IBOutlet UIImageView *questionImage;
@property (weak, nonatomic) IBOutlet UILabel *answerLabel1;
@property (weak, nonatomic) IBOutlet UILabel *answerLabel2;
@property (weak, nonatomic) IBOutlet UILabel *answerLabel3;

- (IBAction)answer1:(id)sender;
- (IBAction)answer2:(id)sender;
- (IBAction)answer3:(id)sender;

@property (weak, nonatomic) IBOutlet UIImageView *cover1;
@property (weak, nonatomic) IBOutlet UIImageView *cover2;
@property (weak, nonatomic) IBOutlet UIImageView *cover3;
@property (weak, nonatomic) IBOutlet UIImageView *cover4;
@property (weak, nonatomic) IBOutlet UIImageView *cover5;
@property (weak, nonatomic) IBOutlet UIImageView *cover6;
@property (weak, nonatomic) IBOutlet UIImageView *cover7;
@property (weak, nonatomic) IBOutlet UIImageView *cover8;
@property (weak, nonatomic) IBOutlet UIView *coreView;

@property (weak, nonatomic) IBOutlet UILabel *resultsLabel;
@property (strong, nonatomic) IBOutlet UITableView *resultsTable;
@property (weak, nonatomic) IBOutlet UIView *resultsView;

@end

我收到此错误“由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[UITableViewCell resultsIcon]:无法识别的选择器已发送到实例” 我被卡住了,不知道如何继续。预先感谢您为我提供的任何帮助或指导。

哦,是的,这是 resultsViewCell.h

@interface resultsViewCell : UITableViewCell

@property (strong, nonatomic) IBOutlet UIImageView *resultsFlag;
@property (strong, nonatomic) IBOutlet UILabel *resultsName;
@property (strong, nonatomic) IBOutlet UIImageView *resultsIcon;

@end

【问题讨论】:

我认为这些resultsTable.delegate = self;resultsTable.dataSource = self; 应该在viewDidLoad 中。此外,如果您的单元格有自定义类和自定义 .xib,那么您必须注册它。如果两者都不正确,请尝试 NSLog 你的数据,看看它是否包含任何内容 当我加载委托和数据源时,我正在加载一个带有表格的 UIView。就数组中的数据而言,我已记录并显示数据实际上已准备好加载,但我假设在单元加载期间我遗漏了一些东西。 你有自定义单元格类和自定义 xib 吗?如果不是,那么在设置 dataSource 和委托之前,请确保您的 tableView 不是 nil 由 NSLog 设置 是的,我刚刚更新了帖子以反映结果视图单元格。 h 文件。 尝试删除代码中的cell.resultsIcon.image... 行,看看它是否有效?否则尝试看看你是否连接错误的 IBOutlet 或其他东西 【参考方案1】:

根据您提供的上述代码,我假设您使用的是自定义单元格。你应该注册那个 resultsViewCell

viewDidLoad

中注册该自定义单元格
[self.resultsTable registerNib:[UINib nibWithNibName:@"NAME_OF_YOUR_CELL_NIB" bundle:nil] forCellReuseIdentifier:@"resultsListCell"];

我注意到在您的 animateResults 方法中,您将 self 分配给 resultsTable 的委托和数据源,不应该是 self.resultsTable 或 _resultsTable

【讨论】:

我已经用你提出的建议更新了帖子,但我仍然收到无法识别的 NSInvalidArgumentException',原因:'-[UITableViewCell resultsIcon]: unrecognized selector sent to instance。哦,是的,我会改变自我。到 self.resultsTable.delegate 并消除 = self? 确保您的自定义单元格 (xib) 在其 .h 文件中声明了 resultsIcon。您需要注册 Nib,我不确定您注册自定义单元格的方式是否有效。您可以像我上面提供的示例一样将其更改为 registerNib 吗?我在回答中问的 resultsTable 怎么样? 我没有使用 nib 文件只是故事板 在这种情况下,您只需将 Storyboard 中的自定义单元格拖到 Storyboard 中的 UITableView 即可。这样做不需要您注册自定义单元格。 欢迎乔。您可能希望接受您的这个问题的答案。【参考方案2】:

首先检查您的questionArray。它不能有任何空对象。

其次,如果您使用故事板中的单元格意味着直接来自tableview,那么您为什么要注册它?

【讨论】:

以上是关于使用 Table 加载 UIView 时无法从其 dataSource 中获取单元格的主要内容,如果未能解决你的问题,请参考以下文章

从其 superView 中删除 UIView 并将其框架扩展到全屏

向下滚动 uitableview 时,UIView 无法正确显示

iview Table组件使用过滤器时无法加载表头解决办法

无法使用 UICollectionVIewCell 数据加载 UIView

无法从 nib 实例化 UIView。 “警告:无法加载任何 Objective-C 类信息”

使用 AVPlayer 播放的视频在 swift3 中从其容器视图中消失