iOS - Objective-C 无法将具有标识符的单元格出列

Posted

技术标签:

【中文标题】iOS - Objective-C 无法将具有标识符的单元格出列【英文标题】:iOS - Objective-C unable to dequeue a cell with identifier 【发布时间】:2016-04-03 20:21:29 【问题描述】:

'无法将带有标识符 news 的单元格出列 - 必须为标识符注册一个 nib 或一个类,或者连接情节提要中的原型单元格'

#import "SidebarViewController.h"
#import "SWRevealViewController.h"



@interface SidebarViewController ()

@property (nonatomic, strong) NSArray *menuItems;
@end



@implementation SidebarViewController


    NSArray *menuItems;



- (id)initWithStyle:(UITableViewStyle)style

    self = [super initWithStyle:style];
    if (self) 
        //custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];

    menuItems = @[@"title", @"news ", @"comments", @"map", @"calendar", @"wishlist", @"bookmark", @"tag"];




- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    // Return the number of rows in the section.
    return menuItems.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    NSString *CellIdentifier = [menuItems objectAtIndex:indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    return cell;


@end

标识符看起来像:

我能用这个做什么?

我正在尝试添加左侧滑动菜单,但是当我按下菜单按钮时它崩溃了。

【问题讨论】:

它们是静态单元格吗?如果没有,为什么你有这么多,除了文本和图像,这些单元格看起来都一样,应该在cellForRowAtIndexPath 中设置。如果它们是静态单元格,那么您不会将它们出列,它们就在那里。 @Paulw11 他们是原型细胞 你能展示你创建SideBarViewController实例的代码吗? @Paulw11 SideBarViewController 的代码在上面完整版 是的,但是您是如何创建您正在展示的实例的?从一个赛格?你只是使用alloc/init - 这是我的怀疑还是从情节提要中实例化了它。 ? 【参考方案1】:

您实际上非常接近,您的问题让许多新开发人员感到沮丧。 dequeueReusableCell 有两个不同的、相互排斥(竞争?)的 API,而您不小心将它们混在一起了。

1.

- (__kindofUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier 

ios2.0 中引入。 此方法能够返回 nil,当它返回时,由您来创建单元格。

2.

- (__kindofUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

推出iOS6.0 此方法不应该能够返回 nil。它要求您为表中的每个索引路径注册一个 UITableViewCell 类和标识符,然后为您“自动”创建单元格。 (这恰逢 UICollectionView 的引入,这就是它们的工作原理)

解决方案。 您正在使用第一种方法(这很好),但您已经使用了第二种方法。 将您的 cellForRow... 方法更改为以下内容:

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

    NSString *CellIdentifier = @"someStaticString" ; 
    //btw, it is poor practice to name variables with a capital. Save that for classes/types
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 

        cell = [[MYcellClass alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; 
    
    //configure cell
    return cell;

或者... 使用 tableView 注册您的单元格类/原型和标识符组合(是的,您可以对所有索引使用相同的设置..),然后保持您的代码不变。

恕我直言,这是一个非常常见的错误,并且没有很好地记录下来,只有在 iOs6 和引入第二种方法之前就一直在开发的人才能在没有帮助的情况下看到差异。最好的。

【讨论】:

【参考方案2】:

给定示例中的所有单元格都应该具有相同的标识符,因为它们非常相似。图标+文本是您单元格的内容。小区标识符描述小区的共同结构。因此,您必须为所有单元格创建一个标识符,并在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中设置图标和标题。

【讨论】:

是的,但在本教程中说我必须给他们不同的标识符 这似乎不是一个特别好的教程。他们可能只是使用了静态单元格,或者他们应该展示了如何正确使用表格视图 @LukaJashiashvili 我建议你找任何其他的 UITableView 教程,因为这个肯定很糟糕

以上是关于iOS - Objective-C 无法将具有标识符的单元格出列的主要内容,如果未能解决你的问题,请参考以下文章

iOS:Objective-C 创建类属性错误:使用未声明的标识符

无法将符合协议的 Objective-C 类分配给具有 Swift 协议的属性

如何将 Objective-C initXXX 方法绑定到具有相同类型参数的 Xamarin.iOS 构造函数?

从 iOS 中的私钥派生的证书(Objective-C)

IOS/Objective-C:无法将 CoreData 值保存到 NSArray

iOS和watchOS(Objective-C)具有不同方法的相同类对象