`
wangpengfei360
  • 浏览: 1060631 次
文章分类
社区版块
存档分类
最新评论

cellDidForRowAtIndexPath方法为什么有时候不调用?

 
阅读更多

UITableView中存在一个Bug,cellDidForRowAtIndexPath委托方法有时候不会调用。具体表现为,第1次实例化ViewController时(加载nib文件)时,reloadData会调用委托方法中的cellDidForRowAtIndexPath方法。而再次实例化一个ViewController对象,reloadData方法就不会触发cellDidForRowAtIndexPath调用了。测试环境为Xcode4.2和SDK 4.3。模拟器和真机都是一样的。

这个Bug还没有人报告给苹果。

进行Debug后发现,IB在多次加载.nib文件时会采取不同的行为。当第1次加载.nib文件时,table view 在reloadData时总是按照numberOfSectionsInTableView-> numberOfRowsInSection -> cellForRowAtIndexPath的顺序调用的。但第2次以后只能按照numberOfSectionsInTableView-> numberOfRowsInSection 来调用。也就是说,在第2次加载nib文件后,数据源方法 cellForRowAtIndexPath 无论如何都不会被调用了。目前还不明白是什么原因。

这种情况是由以下代码造成的:

iPadBindVC* mvc=[[iPadBindVC alloc]initWithNibName:@"iPadBindVC" bundle:nil];

mvc.delegate=self;

[self presentModalViewController:mvc animated:YES];

iPadBindVC含有一个Table View,在viewDidLoad方法的时候我会reloadData这个TableView以便加载一些数据。当以上代码第1次运行时,bebug代码发现,数据源方法cellForRowAtIndexPath被调用了,同时TableView会呈现出数据:

当第2次运行以上代码时,debug代码发现数据源方法cellForRowAtIndexPath不会被调用(但是调用了 numberOfSectionsInTableView和 numberOfRowsInSection ),导致出现一个空白的Table View:

第3次、第4次⋯⋯仍然如此。

我猜测这是苹果对.nib的加载进行了优化的原因。导致第一次加载和多次加载.nib时会有不同的行为。我们可以调整上述代码,“暂时”回避这个bug:

if(vc==nil){

vc=[[iPadBindVC alloc]initWithNibName:@"iPadBindVC" bundle:nil];

vc.delegate=self;

}

[self presentModalViewController:vc animated:YES];

NSLog(@"retaincount:%d",[vc retainCount]);

vc现在变成了一个成员变量,在头文件中声明。也就是说,我们只会加载一次nib文件。如果vc已经从nib文件中构造出来,我们直接present它而不再重新构造。



分享到:
评论

相关推荐

    什么是mysql安装配置教程以及学习mysql安装配置教程的意义

    mysql安装配置教程

    【光伏预测】基于BP神经网络实现光伏发电功率预测附Matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    onlyoffice搭建及与alist使用的view.html

    onlyoffice搭建及与alist使用的view.html

    android-support-v7-recyclerview 添加错误

    1.Project Structure中添加依赖时,容易添加不进去,所以使用本地添加,将android-support-v7-recyclerview放在对应项目的lib文件中,并add as library。如果在build.gradle中出现implementation files('libs\\android-support-v7-recyclerview.jar')就算是添加成功。 2.在布局文件中使用 androidx 的布局控件,在逻辑代码文件中导入androidx相关包。(取代android.support.v7) 3.在gradle.properties文件中,注释android.enableJetifier=true。(# android.enableJetifier=true) 最新way2:

    3款正射影像DOM导入CASS插件(测试通过).rar

    3款正射影像DOM导入CASS插件(测试通过),带坐标导入,超实用!

    什么是c语言以及学习了解c语言的意义是什么

    c语言

    基于java+MapReduce实现基于物品协同过滤算法,即电影推荐系统+源码+开发文档+算法解析(毕业设计&课程设计&项目开发

    基于java+MapReduce实现基于物品协同过滤算法,即电影推荐系统+源码+开发文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 互联网某电影点评网站,主要产品包括 电影介绍 电影排行 网友对电影打分 网友影评 影讯&购票 用户在看|想看|看过的电影 猜你喜欢(推荐) 利用用户对电影的打分表来给用户推荐电影,用户打分表包括以下字段 userID--用户ID号 itemID--电影ID号 score--评分 ###基于物品的协同过滤算法 建立物品的同现矩阵 建立用户对物品的评分矩阵 矩阵计算推荐结果 ###MapReduce实现 程序流程图 .........

    node-v6.9.3-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    poi-3.9.jar

    javaee/javaweb常用jar包,亲测可用,导入到java工程中即可使用

    netty-transport-native-epoll-4.1.68.Final-linux-x86_64.jar

    javaEE javaweb常用jar包 , 亲测可用,下载后导入到java工程中使用。

    grpcio-1.17.0-cp36-cp36m-linux_armv7l.whl

    Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    Python 程序语言设计模式思路-创建型模式:单例模式,确保一个类的唯一实例(装饰器)面向对象编程、继承

    单例模式(Singleton Pattern)作为创建型模式中的一种,旨在确保一个类在系统中只有一个实例,并提供全局访问点。

    基于matlab实现 powell算法 用matlab实现,使用方法内附详细说明.rar

    基于matlab实现 powell算法 用matlab实现,使用方法内附详细说明.rar

    xpp3_min-1.1.4c.jar

    javaee/javaweb常用jar包,亲测可用,导入到java工程中即可使用

    node-v10.6.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Linux系统中常用权限管理命令

    附件是Linux系统中常用权限管理命令,文件格式是markdown,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的! 这些命令是Linux系统中管理文件和目录权限的基础工具。使用这些命令时,需要对权限的表示方法和命令的参数有一定的了解。在执行权限更改操作时,务必谨慎,以避免不必要的安全问题或权限问题。

    netty-resolver-4.1.48.Final.jar

    javaEE javaweb常用jar包 , 亲测可用,下载后导入到java工程中使用。

    telnet出口路由器的实验拓扑

    telnet出口路由器

    Java_android OpenGL的例子.zip

    Java_android OpenGL的例子

    AIR-AP1815-K9-ME-8-5-182-0.zipFor 1815 1830 1840 1850 2700 3700

    AIR-AP1815-K9-ME-8-5-182-0.zip For 1815 1830 1840 1850 2700 3700 加入 AIR-AP1815 的 Mobility Express 管理。

Global site tag (gtag.js) - Google Analytics