通过LLDB表达式动态修改UI

情境

假设您作为iOS开发人员正在开发应用程序的UI组件。 您的PM来了,轻拍您的肩膀以请求更改特定按钮上的颜色。 通常在这种情况下,开发人员会感到不满意,因为这意味着他必须转到代码库来确定与按钮相关的代码的范围,更改其color属性,然后重建并运行该应用程序以验证颜色是否成功更改。

如果这样的请求不是那么频繁,那不是什么大麻烦。 但是,项目经理或设计师可能仍然有问题,请您反复尝试按钮上的不同颜色,直到他们对视觉效果满意为止。

我们是否必须修复代码并重新运行以检查一遍又一遍的agian? 有没有更有效的方法来实现这一目标?

答案是肯定的。 我们甚至不需要更改一行代码就可以做到。 魔术是LLDB表达式。

演示版

让我们有一个在iPhone模拟器上运行的非常简单的应用程序-只需单击视图上的一个按钮即可。 要进入调试模式,我们可以单击工具栏上的暂停按钮:

然后,我们可以输入以下命令:

po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]

此命令将打印出与视图层次结构有关的所有信息,包括其在内存中的地址及其布局。

它告诉我们按钮为0x7fb0c5f15900。 因此,让我们从内存中获取它:

 expression -- id $testView = (id)0x7fb0c5f15900 

expression表示执行以下命令并打印出结果,此处我们尝试将按钮传递给testView。

现在可以修改按钮的颜色了。 在testView上使用expression命令,我们刚刚获取:

  //将按钮的颜色设置为红色 
 expression -- (void)[$testView setBackgroundColor:[UIColor redColor]] 

为了见证更改,我们需要通过键入以下命令来刷新UI:

 expression -- (void)[CATransaction flush] 

然后您将看到按钮按预期变为红色!

总览

本文仅显示了一种使用LLDB表达式处理UI的方法。 LLDB是一个功能强大的工具,使我们能够设置按钮的文本,边框,甚至导航到另一个页面。

对于expression命令,它实际上是ppo的别名; pexpression --相同,而po等于expression -O -- expression。 有关更多用法,请尝试使用help expression进行查找。