原创 SwiftUI: 利用Combine四種方式實時監聽用戶文本輸入

引子 自從Swift 5.1加入了Combine之後,腰不酸了,腿不疼了,各種姿勢都能有了… 我真不是在開車… 不過對於SwiftUI中的TextField來說如何實時監聽用戶輸入的文本呢? 貌似TextField自身並沒有帶用

原创 低版本Xcode在沒有最新DeviceSupport文件時如何調試真機

問題現象 大家知道,一般來說低版本Xcode是無法去調試高版本真機設備的。 我們通常採用的做法是下載最新的iOS DeviceSupport文件,放入Xcode的對應目錄中。 但是如果找不到最新的DeviceSupport文件怎

原创 iOS系統逆向工程之神探侯佩智破量子矩陣

在任何一部編程懸疑動作片裏,每一個超級英雄都有一個頹廢的開始… 本故事純屬虛構 如有雷同洗洗睡吧 警告:未經允許禁止轉載!!! 楔子 未知星球。 雨還在下,漆黑的烏雲壓抑的想吐。 極度的黑暗中,一枚紅點忽明忽暗… 一

原创 SwiftUI如何動態開啓和禁用List的刪除模式

功能需求 在大多數內容管理App中,我們需要完成數據項的刪除操作,可是有時候我們還需要按條件動態禁止用戶的刪除操作。 如下圖所示: 在List的任意子View中,若用戶點擊紅色的選項按鈕展開選項面板,則禁止用戶刪除任何子Vie

原创 SwiftUI一招讓List巨量數據刷新UI速度快100+倍

問題現象 SwiftUI中,若List中包含大量數據,當更新數據時界面會發生嚴重卡頓。 前兩張圖分別演示了在2k條數據下,未優化時需要8.29秒,而優化後只需要0.07秒,相差有118倍之多。 後兩張圖演示了在2w和10w條

原创 Xcode更新DeviceSupport文件後真機調試在App啓動時掛起的解決

問題現象 爲了低版本的Xcode支持高版本系統的真機調試,我們需要下載並安裝對應版本的設備調試支持文件。 Xcode會自動幫我們下載合適的真機設備調試支持文件並自動安裝。 但是,有時在Xcode安裝調試支持文件後,在連接調試真機

原创 iOS項目升級到Xcode11後編譯運行崩潰的原因及解決

好久沒寫Blog了,今天來一發 一個iOS項目,今天第一次用Xcode11打開,出現了若干錯誤,逐一修復後,編譯運行,App可恥的崩鳥… 調試發現崩潰出現在如下一行中: 這個在之前的Xcode10中運行是沒有問題的,那麼可能的

原创 Apple有史以來屏幕最大的手機iPhone 12最新超詳細揭祕

0. 楔子 其實Apple是一家實打實的硬件公司,而他們的皇牌就是iPhone。 雖然每年iPhone都要老生常談的打怪升級,每年都要有幾句吸睛的廣告語,但這並不影響各位果友們一年又一年"喜新厭舊"的期待心情。 更何況iPhone

原创 SwiftUI中TabView+NavigationView適配界面時崩潰等問題的解決

問題現象 若TabView的子視圖中若包含有Form等組件,在快速切換TabItem時往往會導致App崩潰,錯誤信息爲: precondition failure: attribute failed to set an ini

原创 SwiftUI中如何優雅的爲任意View繪製虛線

功能需求 有時我們往往需要在界面畫虛線,尤其是在View的下沿繪製。 一般情況下我們可以繪製Rectangle(矩形)來作爲替代方案: 但它有個問題,如下圖所示: 因爲Rectangle有上下兩條長邊,所以一旦“虛線”繪製的稍

原创 SwiftUI中CoreData上下文Foundation._GenericObjCError崩潰的解決

問題現象 在SwiftUI中使用CoreData管理對象上下文NSManagedObjectContext時出現,App會崩潰,報如下錯誤: Fatal error: Unresolved error Error Domain

原创 iOS中NSDecimalNumber類的一個BUG

我的編程環境是XCode 11.5。 今天在測試秒錶代碼的時候偶然發現秒錶計數會是負值,由此進行了下面的一番探索。 爲了精確,秒錶走過的秒數用Decimal類型: @Published var elapsedSeconds_exa

原创 Swift派生與不派生自NSObject對象之間等於比較的不同

本文簡單介紹了Swift中派生與不派生自NSObject的類,在等於比較時表現出的不同行爲;還順帶討論了創建大數組時效率的問題. 等於或不等於 我們知道對於數組的比較來說,實際比較的是它們中的每一個對應位置上元素. 所以最終都

原创 如何寫一個顯示iOS線程編號的小擴展

我們在測試iOS下多線程併發編程時往往需要區分不同的線程。 我們知道Thread有一個name實例變量可以用來給線程命名,但是那些系統自動創建的線程你就拿它沒辦法了吧? 其實Thread實例自身是有編號的,不過並沒有直接導出。

原创 淺析Swift中Combine框架自定義訂閱操作符

引子 Swift 5.1中蘋果終於千呼萬喚始出來祭出Combine框架,帶着一層神祕的面紗,它來啦!它來啦!它來啦! Combine框架顛覆了以往蘋果的開發模式,它用發佈者(Publishers),訂閱者(Subscribers)