所以我为我的学校做了一个rss阅读器,并完成了代码。我运行了测试,它给了我这个错误。下面是它引用的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
if (cell == nil) {
cell =
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:CellIdentifier];
}
以下是输出中的错误:
2012-10-04 20:13:05.356 Reader[4390:c07] * Assertion failure in
-[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460 2012-10-04
20:13:05.357 Reader[4390:c07] * Terminating app due to uncaught
exception 'NSInternalInconsistencyException', reason: 'unable to
dequeue a cell with identifier Cell - must register a nib or a class
for the identifier or connect a prototype cell in a storyboard'
* First throw call stack: (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0
0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34
0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7
0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5
0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935)
libc++abi.dylib: terminate called throwing an exception
下面是它在错误屏幕上显示的代码:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
请帮助!
我昨晚花了几个小时来解决为什么我的编程生成的表崩溃了[myTable setDataSource:self];它可以注释掉并弹出一个空表,但每次我试图访问数据源时都崩溃了;
我在h文件中设置了委托:@interface myViewController: UIViewController
我在我的实现中有数据源代码,仍然BOOM!,每次都崩溃!感谢“xxd”(nr 9):添加那行代码为我解决了这个问题!事实上,我从一个IBAction按钮启动一个表,所以这是我的完整代码:
- (IBAction)tapButton:(id)sender {
UIViewController* popoverContent = [[UIViewController alloc]init];
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
popoverView.backgroundColor = [UIColor greenColor];
popoverContent.view = popoverView;
//Add the table
UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 300) style:UITableViewStylePlain];
// NEXT THE LINE THAT SAVED MY SANITY Without it the program built OK, but crashed when tapping the button!
[table registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
table.delegate=self;
[table setDataSource:self];
[popoverView addSubview:table];
popoverContent.contentSizeForViewInPopover =
CGSizeMake(200, 300);
//create a popover controller
popoverController3 = [[UIPopoverController alloc]
initWithContentViewController:popoverContent];
CGRect popRect = CGRectMake(self.tapButton.frame.origin.x,
self.tapButton.frame.origin.y,
self.tapButton.frame.size.width,
self.tapButton.frame.size.height);
[popoverController3 presentPopoverFromRect:popRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
#Table view data source in same m file
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog(@"Sections in table");
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"Rows in table");
// Return the number of rows in the section.
return myArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSString *myValue;
//This is just some test array I created:
myValue=[myArray objectAtIndex:indexPath.row];
cell.textLabel.text=myValue;
UIFont *myFont = [ UIFont fontWithName: @"Arial" size: 12.0 ];
cell.textLabel.font = myFont;
return cell;
}
顺便说一下:如果你想将弹出窗口锚定在IBAction和IBOutlet上,这个按钮必须与IBAction和IBOutlet链接起来。
UIPopoverController *popoverController3在H文件中直接声明在@interface between{}之后
你必须意识到,当使用接口生成器和创建包含一个单元格的Xib (nib)时,还创建了一个占位符,指向将被使用的类。意思是,当你在一个Xib文件中放置两个UITableViewCell时,你可能会遇到完全相同的麻烦,导致***断言失败....占位符机制不起作用,n会感到困惑。取而代之的是在一个Xib中放置不同的占位符。
最简单的解决方案(即使看起来有点简单)是每次在一个Xib中放置一个Cell。IB将为您创建一个占位符,然后所有工作都按照预期进行。但是这将直接导致额外的一行代码,因为您需要加载正确的nib/xib,并请求它所在的reuseIdentified Cell。
因此,下面的示例代码着重于在一个表视图中使用多个Cell标识符,断言失败是非常常见的。
// possibly above class implementation
static NSString *firstCellIdentifier = @"firstCellIdentifier";
static NSString *secondCellIdentifier = @"secondCellIdentifier";
// possibly in -(instancetype)init
UINib *firstNib = [UINib nibWithNibName:@"FirstCell" bundle:nil];
[self.tableView registerNib:firstNib forCellReuseIdentifier:firstCellIdentifier];
UINib *secondNib = [UINib nibWithNibName:@"SecondCell" bundle:nil];
[self.tableView registerNib:secondNib forCellReuseIdentifier:secondCellIdentifier];
在一个UITableView中使用两个CellIdentifier的另一个麻烦是必须考虑行高和/或节高。两个单元格当然可以有不同的高度。
当为重用注册类时,代码看起来应该有所不同。
当单元格位于Storyboard而不是Xib中时,“简单解决方案”看起来也有很大不同。注意占位符。
还要记住,界面构建器文件有版本变化,需要设置为目标操作系统版本支持的版本。即使你很幸运,你在Xib中放置的特定功能自上一个IB版本以来没有改变,也没有抛出错误。因此,使用IB制作的Xib被设置为兼容iOS 13+,但用于在早期版本iOS 12.4上编译的目标也会导致麻烦,并可能以断言失败告终。