DequeueReusableCell 仅在 iPhone 4S 上崩溃应用程序

Posted

技术标签:

【中文标题】DequeueReusableCell 仅在 iPhone 4S 上崩溃应用程序【英文标题】:DequeueReusableCell crashes app on iPhone 4S only 【发布时间】:2016-02-25 16:40:51 【问题描述】:

我正在使用 Xamarin + Mvvmcross 开发应用程序。目前它在 iPad Mini、iPad 2,3、iPhone 5S 和 6 上运行良好。奇怪的是,其中一个视图在运行 ios 7.1 的 iPhone 4S 上崩溃了。所有测试均使用真实设备完成。

这是崩溃:

https://gist.github.com/nunohorta/2b84245899e8c0daa116

表格源代码是这个:

    public class MessagesTableSource : MvxStandardTableViewSource

    UITableView _tableview;
    MessagesView _parent;
    UILabel messageLabel;

    private static readonly NSString MessageCellIdentifier = new NSString("MessageCell");

    public MessagesTableSource(UITableView tableView, MessagesView parent) : base(tableView)
    
        _tableview = tableView;
        _parent = parent;
    

    public override nint RowsInSection (UITableView tableview, nint section)
    
        return _parent.ViewModel.Messages != null ? _parent.ViewModel.Messages.Count : 0;
    

    public override nint NumberOfSections (UITableView tableView)
    
        if (_parent.ViewModel.Messages != null && _parent.ViewModel.Messages.Count > 0) 
            return 1;
         else 
            /*
             * Custom View here
             * 
             * */

            return 0;
        
    


    protected override UITableViewCell GetOrCreateCellFor (UITableView tableView, NSIndexPath indexPath, object item)
    
        var cell = (MessageCell)tableView.DequeueReusableCell("MessageCell");
        return cell;
    

我也在 viewDidLoad 上注册这样的自定义类:

    tableView.RegisterNibForCellReuse(UINib.FromName("MessageCell", NSBundle.MainBundle), MessageCellIdentifier);

我不知道为什么它只是在一个设备上崩溃...崩溃似乎发生在 UIKit/CoreFoundation 上。

【问题讨论】:

FIXED> 看起来由于某种原因,我有一个整数类型的运行时属性,其值 5 在我的 xib 文件中定义。出于某种神奇的原因,iOS 在 7.1 上崩溃了,但在其他版本上却没有。 【参考方案1】:

您可能需要将 MessageCell Nib 注册到自定义 MessageCell 类,就像在视图中加载方法一样。因为第一次它可能找不到带有标识符的单元格。

tableView.registerNib(UINib(nibName: "CustomOneCell", bundle: nil), forCellReuseIdentifier: "CustomCellOne")

将具有标识符的单元队列

tableView.dequeueReusableCellWithIdentifier("CustomCellOne", forIndexPath: indexPath) as! CustomOneCell

希望对解决问题有所帮助。

【讨论】:

对不起,我忘了在上面添加。我已经在这样做了,否则它会在所有设备/iOS 上崩溃 包括上面缺失的代码。检查 nib 是否分配了 Class 和 identifier?请让我知道它是否解决了您的问题。 恐怕这些变化仍然会发生同样的崩溃:/ 声明“public override nint RowsInSection”中的 nint 是什么。我认为这是错误的返回类型。它应该是int 这似乎没问题。无论如何,我向 .Count 添加了一个演员表,以确保它返回一个 nint。我认为如果这不正确,它会在所有设备上崩溃

以上是关于DequeueReusableCell 仅在 iPhone 4S 上崩溃应用程序的主要内容,如果未能解决你的问题,请参考以下文章

dequeueReusableCell 之后的单元格布局

iOS:UICollectionView 内容重置和 dequeueReusableCell

如何使用 tableView.dequeueReusableCell 以编程方式将单元格样式添加到单元格?

如何在 UITableView 中实现 dequeueReusableCell(withIdentifier:) 的代码?

dequeueReusableCell 打破了cliptobounds

如何在不弄乱内容的情况下标记 dequeueReusableCell?