ios - UIKit 问题 - 在 IBOutlet 项目上设置颜色需要花费大量时间

标签 ios objective-c uikit uicolor iboutlet

我有一个奇怪的问题。

我正在运行以下代码,loginButton 是一个简单的 UIViewController 中的 IBOutlet UIButton

-(void)updateLayout{

   NSDate *startColor = [NSDate date];
   loginButton.backgroundColor = UIColorFromRGB([MSThemeManager getCoreColor]);
   pageControl.backgroundColor =UIColorFromRGB([MSThemeManager getCoreColor]);
   NSDate *methodFinishColor = [NSDate date];
   NSTimeInterval executionTimeColor = [methodFinishColor timeIntervalSinceDate:startColor];
   NSLog(@"Execution Time for getColorMethod: %f", executionTimeColor);
}

日志中提供的执行时间是非常正确的,所以 getColorMethod 没有问题,它也被用在很多不同的地方没有任何问题:

2014-05-15 16:40:28.570 TnMC[9642:4007] Execution Time for getColorMethod: 0.000132

但具体来说,loginButtonpageControl 上的颜色更新很容易需要 10 到 20 秒,并且没有任何褪色。

注意:
- loginButton 上与颜色无关的其他 UI 更新,例如更改 titleLabel.text 是在同一方法中即时完成的
- 应用程序中没有同时进行其他处理
- 这一切都在主线程上进行,updateLayout 因通知而被调用

   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLayout) name:nAppUpdateLayout object:nil];

有什么想法吗?

最佳答案

让我详细说明一下这种问题,我相信很多其他正在学习 iOS 的开发人员都遇到过或将会遇到这种问题。

基本上,每当您进行一些基本的 UI 更改(如背景颜色、文本颜色等)或其他不需要大量计算且 UI 未更新的 UI 更改时,您必须首先检查两件事(除了更改 UI 的代码的正确性)。

  1. 当您尝试更新/更改某些内容时,您的 UI 是否卡住了?

  2. 如果您的 UI 没有卡住,它是否完全更新,或者代码是否已执行?

如果发生了第一点,显然您在主线程上做了很多工作,您必须将繁重的工作转移到后台线程上。

如果发生第二点,则可能有两个原因。首先你的代码是错误的,它永远不会被调用,或者代码是在后台线程上调用的。

为了确定您的代码是否在后台线程上执行,只需在更新代码的地方放置一个断点并检查调试导航器以查看线程号,如果它不是主线程,则将其置于主线程.

查明您的代码是否在后台线程上的第二种方法是......令人惊讶......一个丑陋的崩溃。

在后台执行的 UI 代码还有一个非常常见的问题是使用 NSNotification 来更新 UI。经验法则:NSNotification 与调用者发布在同一线程上。

关于ios - UIKit 问题 - 在 IBOutlet 项目上设置颜色需要花费大量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681708/

相关文章:

ios - 使用 MagicalRecord 在后台执行获取请求

iOS 在 UITextView 中的单词后放置光标

ios - UIApplication 发送操作 :to:from:forEvent: iOS7 no user code

ios - UICollectionViewFlowLayout 未正确换行

iphone - iOS 确定 VoiceOver 是否仍在说话

android - 如何检查手机上的响应式用户界面?

ios - 以编程方式将数据源分配给 UITableView 而不调用数据源方法

ios - 在 Swift 中下拉搜索栏/ View ?

iPhone 隐藏状态栏将 View 向下移动 20 像素

ios - UIFont - 如何获取系统细字体