日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift之深入解析如何使用Xcode和LLDB v2修改UI元素

發(fā)布時間:2024/5/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift之深入解析如何使用Xcode和LLDB v2修改UI元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

  • 在上一篇博客中,已經詳細地介紹如何使用 LLDB 表達式修改 UI 元素,具體請參考:Swift之深入解析如何將代碼添加為自定義LLDB命令。
  • 在這篇博客中,將繼續(xù)討論相同的問題需求,并將重點討論如何最大限度地利用 LLDB 表達式,如果工具太過復雜,那么它就無法工作并獲得用戶的采用,出于這個原因,本文將分享一些使 LLDB 表達式更容易使用的替代方法。

二、命令別名

  • 首先,必須輸入(或復制)這個長度的命令(例如 po [[[UIApplication sharedApplication] keyWindow] recursiveDescription])可能會阻礙開發(fā)者使用這些 LLDB 命令。幸運的是,這個問題有解決方案,它被稱為命令別名,惟一需要做的就是編輯位于 ~/.lldbinit 目錄中的文件,Lldbinit(或者通過鍵入 touch ~/.lldbinit 創(chuàng)建它),并添加如下命令:
command alias views expression -l objc -O -- [[[UIApplication sharedApplication] keyWindow] recursiveDescription]command alias flush expression -l objc -- (void)[CATransaction flush] command regex change_color 's/(.+) (.+)/e (void)[(id)%1 setBackgroundColor:[UIColor %2]]/'
  • 前兩個命令在Swift之深入解析如何將代碼添加為自定義LLDB命令已經介紹使用過,第一個是打印視圖層次結構,獲取按鈕的內存地址,第二個是刷新 UI。
  • 最后一個命令演示了如何使用 regex 創(chuàng)建帶參數的命令,在這個特定的情況下,需要一個內存地址和顏色的名稱(blueColor),結果按鈕的背景顏色將會改變。例如,運行 change_color 0x7f9f7e40cd70 blueColor 并刷新將導致將按鈕的背景顏色更改為藍色。
  • 使用別名將提高使用此工具的可能性,但在某些情況下需要更高級的別名。比如說,如何通過按鈕標簽的文本找到按鈕的內存地址。在這種情況下,Python 可以提供可擴展性。

三、LLDB 與 Python

  • 現在開始編寫 Python 命令的一個簡單方法是使用 Xcode 控制臺,輸入命令腳本添加幫助并遵循說明:

  • 或者,可以創(chuàng)建一個腳本文件,它可以添加到回收和版本控制系統中,然后在 Xcode 控制臺上運行命令 command script import <script_file_path>,或者更好的方法是將它添加到 ~/.lldbinit 文件中。
  • 要寫一個 Python 函數用作新的 LLDB 命令,需要實現一個帶有四個參數的函數:
def command_function(debugger, command, result, internal_dict):# Your code goes here
  • 根據 LLDB python 參考,這些變量的類型和描述如下:
    • debugger (類型:lldb.SBDebugger):當前調試器對象;
    • command (類型:python string):一個包含命令所有參數的 Python 字符串,如果需要分割參數,請嘗試使用 shlex 模塊的 shlex.split(命令)來正確地提取參數;
    • result (類型: lldb.SBCommandReturnObject):一個返回對象,它封裝了命令的成功/失敗信息,以及作為命令結果需要打印的輸出文本,普通的 Python“print” 命令也可以工作,但默認情況下文本不會進入結果(它作為臨時日志記錄工具很有用);
    • internal_dict (類型:python dict object): 當前嵌入腳本會話的字典,其中包含所有變量和函數。
  • 如果使用命令腳本導入方法,可以像下面這樣定義 __lldb_init_module 函數:
def __lldb_init_module(debugger, internal_dict):# Command Initialization code goes heredebugger.HandleCommand('command script add -f filter.filter_button_by_label filter_button_by_label')
  • 其中調試器和 internal_dict 如上所述,當加載模塊時,這個函數將被調用,允許在當前調試器中添加任何想要的命令。debugger.HandleCommand 的參數描述如下:
    • command script add:使用 LLDB 命令添加腳本;
    • -f argument:指定命令將執(zhí)行的 Python 函數的名稱,它遵循的格式:{module name}.{function name};如同上面的例子中:
      • filter:是模塊的名稱(在 Python 中只是不帶 .py 擴展名的文件名);
      • filter_button_by_label:命令功能,描述同 command_function(debugger, command, result, internal_dict)) 一致;
    • argument(例如 filter_button_by_label):是 Xcode 控制臺中用來調用此函數的命令。
  • 如下所示,展示了一個如何從按鈕標簽的文本中獲取按鈕內存地址的示例:
import lldb import commands import optparse import shlex import redef create_options():usage = "usage: filter_button_by_label [options]"description='''This command is used to find a UIButton with a label matching the option provided as option'''parser = optparse.OptionParser(description=description, prog='filter_button_by_label', usage=usage)parser.add_option('-n', '--needle', type='string', dest='needle', help='Text to search on UIButton labels.')return parserdef filter_button_by_label(debugger, command, result, internal_dict):target = debugger.GetSelectedTarget()process = target.GetProcess()mainThread = process.GetThreadAtIndex(0)currentFrame = mainThread.GetSelectedFrame()# Parse arguments and optionscommand_args = shlex.split(command)parser = create_options()try:(options, args) = parser.parse_args(command_args)# if needle is not providedif not options.needle:parser.print_help()returnexcept:returnview_hierarchy_command = '(id)[[[UIApplication sharedApplication] keyWindow] recursiveDescription]'view_hierarchy = currentFrame.EvaluateExpression(view_hierarchy_command).GetObjectDescription()for match in re.finditer('.*<UIButton: (0x[0-9a-fA-F]*);.*', view_hierarchy, re.IGNORECASE):view = match.groups()[-1]created_command = '(NSString *)[ (id)' + view + ' currentTitle]'title = currentFrame.EvaluateExpression(created_command).GetObjectDescription()if title == options.needle:print >>result, viewelse:print >>result, "Not Found"def __lldb_init_module(debugger, internal_dict):debugger.HandleCommand('command script add -f ' + __name__ + '.filter_button_by_label filter_button_by_label')
  • 它可以像 filter_button_by_label -n “Press me” 這樣調用,它會返回那個按鈕的內存地址。因此改變按鈕顏色的整個流程就變成:

  • 與第一個實現相比,代碼更短,更容易記憶,因此更容易使用。

四、Chisel

  • 除此之外,Facebook 已經提供了一個名為 Chisel 的開源 LLDB 命令集,它提供了大量的命令,可能解決了任何 iOS 開發(fā)者可能面臨的大多數問題。
  • 如下所示,個人最喜歡的兩個命令:
    • findinstances:可以用來查找指定 ObjC 類的實例;
    • pcurl:它可以被用來打印作為 curl 命令的 NSURLRequest,稍后可以用于調試目的。

總結

以上是生活随笔為你收集整理的Swift之深入解析如何使用Xcode和LLDB v2修改UI元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产依人 | 一区国产在线 | 69精品久久久 | 一本高清dvd在线播放 | 中文字幕第35页 | 日韩高清三区 | 亚洲欧洲精品一区二区 | 青草青青视频 | 二区三区| 999视频| wwww在线观看 | 国产吞精囗交久久久 | 国产精品一区电影 | 麻豆黄色片 | 欧美狠狠操 | 五月花成人网 | 国产中文视频 | 国产一区免费在线观看 | 91久久视频 | www日本xxx| 久久久成人精品 | 想要视频在线观看 | 国产人妻人伦精品1国产盗摄 | 网站免费在线观看 | 久热久色| 美女露出让男生揉的视频 | 老司机深夜福利在线观看 | 香蕉a视频 | 成人国产精品视频 | 丰满人妻一区二区三区免费视频 | 影音先锋人妻啪啪av资源网站 | 日韩美一区二区 | 国产91丝袜在线播放九色 | 成人精品一区日本无码网 | 可以在线观看的av | 久久黄色免费视频 | 国产一区二区99 | 色狠狠操| 色88久久久久高潮综合影院 | 国产精品久久一区 | 日韩精品人妻中文字幕有码 | 色婷婷av国产精品 | 岛国一区 | 亚洲精品男人的天堂 | 9.1成人看片免费版 日韩经典在线 | 天天干天天上 | 久久中字 | 欧美女优在线观看 | 日韩精品中文在线 | 污污污污污污www网站免费 | 无码人妻丰满熟妇区五十路百度 | 在线观看亚洲一区 | xx69欧美| 国产污在线观看 | 亚洲第一黄色 | 日韩欧美一区二区三区在线 | 欧美一及片 | 欧美三日本三级少妇三 | 国产情侣露脸自拍 | 精品欧美日韩 | 久久无码专区国产精品s | 四虎啪啪 | 超黄网站在线观看 | 三级伦理片 | 亚洲av无码一区二区乱孑伦as | 色吧综合 | 亚洲图片在线观看 | 国产又爽又黄视频 | 欧美乱大交 | 国产性猛交普通话对白 | 亚洲AV无码久久精品色三人行 | 韩国三级hd两男一女 | www.天堂av| 亚洲一级黄色片 | 国产夜色视频 | 在线观看亚洲网站 | av激情在线 | 国产真人做爰毛片视频直播 | 国产自产一区二区 | 中文无码精品一区二区三区 | 哪里可以免费看毛片 | 欧美日韩国产精品一区 | 黄色不卡| h视频在线看 | 国产制服91一区二区三区制服 | 久久avav| 韩国三级中文字幕hd浴缸戏 | 91黄免费 | 日本理论中文字幕 | 男女网站在线观看 | 欧美性免费 | 成人wwxx免费观看 | 怡红院最新网址 | 好男人在线视频www 亚洲福利国产 | 日韩中文字幕不卡 | 久久亚洲熟女cc98cm | 美女被日网站 | 麻豆免费视频 | sm一区二区三区 |