V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
miketeam
V2EX  ›  问与答

iOS 开发第三方库 FDTemplateLayoutCell 的坑

  •  
  •   miketeam · 2016-10-11 16:41:16 +08:00 · 2674 次点击
    这是一个创建于 2972 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 FDTemplateLayoutCell 配合 masonry 布局自动高度,今天遇到了一个坑:就是明明 registerClass 了却老是 bug ,提示信息是没有 registerClass 的 CellReuseIdentifier ,我的这 UITableViewController 是继承字我自己封装的 BaseTableViewController,去除这个继承就不会提示这个 bug 了。。

    然后正题来了:请问各位 iOS 开发的大神平时是如何找向这样(提示信息莫名其妙的 bug )的 bug 呢?

    17 条回复    2016-10-12 16:55:37 +08:00
    kera0a
        1
    kera0a  
       2016-10-11 17:01:46 +08:00
    提示信息里显示 没有 registerClass ,那肯定是某个 UITableView 没有 register 呗。
    这个错误提示也不是 FDTemplateLayoutCell 的坑,和它没任何关系。

    首先你在 cellForRowAt 里断点,看看调用 dequeueReusableCell 的 TableView 和你 register class 时的 TableView 是不是一个。打印他们的内存地址比对
    kera0a
        2
    kera0a  
       2016-10-11 17:04:32 +08:00
    另外你调用 FDTemplateLayoutCell 的计算高度的方法,一定得用你 register class 的那个 UITableView 的实例来调用。

    因为他里面也有一个 dequeueReusableCell 方法调用,如果这两个 TableView 不是同一个,也不行。
    miketeam
        3
    miketeam  
    OP
       2016-10-11 17:07:37 +08:00 via iPhone
    我表示都注册了 ID 的。。然后就是提示那个错误,不用继承类就没有问题
    kera0a
        4
    kera0a  
       2016-10-11 17:09:43 +08:00
    @miketeam
    在你注册的地方,打印 TableView 的内存地址,
    在你报错的地方,打印 TableView 的内存地址。
    比对一下看是不是一样
    miketeam
        5
    miketeam  
    OP
       2016-10-11 17:25:35 +08:00
    直接使用 UITableViewController 的话没有问题,内存地址一样: 0x10116ae00 ;让这个类继承于我的 BaseTableViewController 就直接挂球了, First throw call stack:
    (0x183d781c0 0x1827b055c 0x183d78094 0x18480282c 0x1000bbcf8 0x1000bbef8 0x1000bc9dc 0x10013f1f0 0x189f0a250 0x189ce0800 0x189ca01a4 0x189c9f5f4 0x189c9f380 0x189c9f1b4 0x189efd6f0 0x189efce20 0x1000ee558 0x10013d608 0x189bc13dc 0x189bd8f70 0x189d614bc 0x189c79b84 0x189c797ec 0x189c79750 0x189bbe54c 0x18708640c 0x18707b0e8 0x18707afa8 0x186ff7c64 0x18701f0d0 0x189bb3c1c 0x183d257dc 0x183d2340c 0x183d2389c 0x183c52048 0x1856d5198 0x189c2c628 0x189c27360 0x100155d68 0x182c345b8)。

    我为什么感觉就是这个继承出了问题呢?我先断点调试,但是都是在 FDTemplateLayoutCell 里面来回跳。然后我做了一个对比 demo ,不用继承,就没有问题了。 instrument 里面那个工具可以诊断这个问题呢?
    miketeam
        6
    miketeam  
    OP
       2016-10-11 17:28:38 +08:00
    对于这个事情其实我是更想知道:大家如果遇到这提示信息不太相关的 bug 如何调试呢?
    LINAICAI
        7
    LINAICAI  
       2016-10-11 17:48:14 +08:00
    人家第三方库真莫名躺枪,自己不好好找错,没证据别黑吧。。。
    miketeam
        8
    miketeam  
    OP
       2016-10-11 18:02:09 +08:00
    没有黑库。。。你都没看完,我其实想看看大家如何找 bug 的
    loveuqian
        9
    loveuqian  
       2016-10-11 19:40:49 +08:00 via iPhone
    一般的 bug 都是靠提示解决

    乱七八糟的 bug 一般都是靠蒙
    loveuqian
        10
    loveuqian  
       2016-10-11 19:41:32 +08:00 via iPhone
    这框架我也有在用
    暂时没问题
    free9fw
        11
    free9fw  
       2016-10-11 20:25:23 +08:00
    这个 bug 貌似在 iOS7.0 上面会发生,但应该跟阳神的库无关
    miketeam
        12
    miketeam  
    OP
       2016-10-11 20:44:10 +08:00
    我不确定啊,所以我正在看这个 oc 继承的东西以及阳神的源码。让我很奇怪这个事,。。
    fengyunSmlie
        13
    fengyunSmlie  
       2016-10-11 21:32:16 +08:00
    上代码看看吧 这样扯找不到的
    fengyunSmlie
        14
    fengyunSmlie  
       2016-10-11 21:35:20 +08:00
    @miketeam 阳神的是可以用的啊
    miketeam
        15
    miketeam  
    OP
       2016-10-12 09:06:44 +08:00
    base 里面内容:
    -----------------------------------------------
    - (void)viewDidLoad {
    [super viewDidLoad];


    //注册 cell , 本表所有的 cell 都是代码定义

    if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) {
    self.automaticallyAdjustsScrollViewInsets = NO;
    }

    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    // 取消滚动条
    self.tableView.showsVerticalScrollIndicator = NO;
    self.tableView.showsHorizontalScrollIndicator = NO;
    self.tableView.multipleTouchEnabled = NO;
    [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    [self.tableView setLayoutMargins:UIEdgeInsetsZero];

    }

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
    [cell setSeparatorInset:UIEdgeInsetsZero];
    [cell setLayoutMargins:UIEdgeInsetsZero];

    }

    ---------------------------------------------

    在 viewDidLoad 里面注册
    '
    [self.tableView registerClass:[CustomerBootTableViewCell class] forCellReuseIdentifier:checkCellBottomID];
    '
    ----------------------------------------------
    计算高度
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    if (indexPath.row == 11) {
    NSDictionary *dics = self.requestInfoDictiongary;
    return [self.tableView fd_heightForCellWithIdentifier:checkCellBottomID cacheByIndexPath:indexPath configuration:^(CustomerBootTableViewCell *cell) {
    cell.footLabel.text = [dics stringForKey:@"RequestRemark"];
    }];

    }
    else{
    return 48;
    }

    }

    ---------------------------------------------
    在该类的头里面
    @interface CheckDetailViewController : UITableViewController//没有问题

    @interface CheckDetailViewController : BaseTableViewController//bug 了
    zhangchioulin
        16
    zhangchioulin  
       2016-10-12 14:59:30 +08:00
    看到了在用 OC 的兄弟好感动....我以为大家都转 S Swift 了
    miketeam
        17
    miketeam  
    OP
       2016-10-12 16:55:37 +08:00
    ...私下我也用 swift ,公司里的东西早做完早回家,干嘛用 swift 啊,改个版改一片。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1022 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.