該庫為MACOS上的AppKit (beta質量,相當可用)和iOS/TVOS上的UIKit (alpha質量,請參見Repo)提供安全的生鏽綁定。它試圖以某種方式這樣做,如果您在框架之前(在Swift或Objective-C中)進行了編程,則會感到熟悉。由於所有權模型,這在Rust中很棘手,但是一些創意的編碼和假設可以使我們走得更遠。
這部分存在於Crates.io上,部分是為了使項目能夠查看更廣泛的用法,這可以為開發提供信息。也就是說,該圖書館目前是早期階段,可能有錯誤 - 您對它的使用情況自發。但是,只要您遵守規則(關於內存/所有權),對於某些應用程序來說,它已經很好。核心存儲庫有很多示例可以幫助您入門。
重要的
如果您的遷移從0.2到0.3,則應選舉
appkit或uikit作為Cargo.toml中的功能。進行了更改,以支持不僅是MacOS/iOS/TVOS(例如,Gnustep,Airyx)的平台。需要這些功能之一。appkit違約,以便於開發。
請注意,此板條箱依賴於Objective-C運行時。與運行時的接口需要不安全的塊;該板條箱為您處理那些不安全的交互,並提供一個安全的包裝器,但是通過使用此板條箱,您可以理解,
unsafe用法是給定的,並且對包裝控件會有些猖ramp。這並不意味著您無法評估,審查或質疑不安全的用法 - 只知道它正在發生,而且在很大程度上不會消失。與僅存在不安全的存在有關的問題將在沒有評論的情況下關閉。
如果您想在本地計算機上為此構建文檔,則由於功能標誌與cargo doc一起使用的方式,因此需要以下內容:
RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --open
use cacao :: appkit :: { App , AppDelegate } ;
use cacao :: appkit :: window :: Window ;
# [ derive ( Default ) ]
struct BasicApp {
window : Window
}
impl AppDelegate for BasicApp {
fn did_finish_launching ( & self ) {
self . window . set_minimum_content_size ( 400. , 400. ) ;
self . window . set_title ( "Hello World!" ) ;
self . window . show ( ) ;
}
}
fn main ( ) {
App :: new ( "com.hello.world" , BasicApp :: default ( ) ) . run ( ) ;
}有關更徹底的示例,請檢查examples/文件夾。
如果您對一個更“廚房的水槽”示例感興趣,請查看以下情況:
cargo run --example todos_list由於AppKit和Uikit程序通常工作的方式,因此鼓勵您從AppDelegate的did_finish_launching()方法開始完成大部分工作。這樣可以確保該應用程序有時間初始化並進行幕後必要的任何家政服務。
在主要工作的作品方面,下表顯示了對不同功能的支持水平。僅憑文檔更新為地獄,此列表並不詳盡 - 因此,您鼓勵您查看代碼構建的文檔以獲取更多信息:
請注意,雖然iOS具有綠色的複選標記,但某些組件仍然沒有很好地定義(例如,Views/View Controllers仍然非常alpha)。
非應用程序平台或提供AppKit形式的非應用平台可能能夠在此庫中使用大量的AppKit支持。
| 成分 | 描述 | AppKit | ios | TVOS |
|---|---|---|---|---|
| 應用程式 | 初始化和事件 | ✅ | ✅ | |
| 窗戶 | 建築,處理,活動 | ✅ | ✅ | |
| 看法 | 構建,樣式,活動 | ✅ | ✅ | |
| ViewController | 施工,生命週期活動 | ✅ | ✅ | |
| 顏色 | 系統支持的顏色,主題 | ✅ | ✅ | |
| ListView | 可重複使用的列表,帶有緩存行 | ✅ | ||
| 按鈕 | 樣式,活動,工具欄支持 | ✅ | ||
| 標籤/Textfield | 文本渲染和輸入 | ✅ | ||
| 圖像/圖像視圖 | 加載,繪圖等 | ✅ | ✅ | |
| 工具欄 | 基本的本機工具欄 | ✅ | ||
| SplitViewController | 拆分視圖(大蘇爾友好) | ✅ | ||
| WebView | WKWebView的包裝器 | ✅ | ||
| UserDefaults | 堅持小數據 | ✅ | ✅ | |
| AutoLayout | 查看不同屏幕的佈局 | ✅ | ✅ |
以下是可以啟用或禁用的貨物功能的列表。
appkit :links AppKit.framework 。uikit :links UIKit.framework (僅iOS/tvos)。cloudkit :links CloudKit.framework ,並在CloudKit功能上提供一些包裝器。目前尚未完整。color_fallbacks :為不存在systemColor類型的舊系統提供後備顏色。此功能非常罕見,您可能不需要它。quicklook :links QuickLook.framework ,並提供用於生成文件預覽圖像的方法。user-notifications :鏈接UserNotifications.framework並提供了發出MACOS和iOS通知的功能。請注意,這需要您的申請被代碼簽名,並且沒有它就無法正常工作。webview :links WebKit.framework ,並提供由WKWebView支持的WebView控件。由於平台沒有WebView控件,因此不支持此功能。由於WKWebView控件和非應用程序平台上的支持,此功能也可能僅支持MACOS/iOS。webview-downloading-macos :啟用通過私人接口從WebView下載文件。這不是應用程序店安全功能,因此在啟用之前請注意。此功能在iOS上不支持(用戶將處理下載非常不同)或TVO(那裡根本沒有Web瀏覽器)。 為什麼不擴展現有的可可板箱?
一個好問題。歸根結底,那個板條箱(我相信,如果我錯了,有人可以糾正我)與伺服器有些緊密相關,我想嘗試一下代表Rust中可可UI模型的最佳方法。該板條箱並不完全忽略他們的工作 - core_foundation和core_graphics在內部使用並重新出口供一般使用。
為什麼我要用生鏽而不是X語言寫作?
就我而言,我希望能夠為我的設備編寫本機應用程序(以及我喜歡構建產品的平台),而無需鎖定使用特定於Apple的語言寫作...並且不用C/C ++或JavaScript寫入(注意:工具鏈,而不是語言-ES6/typescript)。我想這樣做,因為當我想將應用程序移植到其他生態系統時,我已經厭倦了完成工作。我認為Rust提供了一個(增長但重要的)可行模型,用於在不犧牲性能的情況下在平台和生態系統之間共享代碼。
(這是互聯網亮起的部分,對電子,QT等的某種組合感到憤怒 - 我們在這裡並不困擾,因為它在其他地方被毆打致死)
該板條箱對於不需要全力以赴的人來說很有用,但希望相對輕鬆地將其工作放置在那裡。沒想到每個人都會突然想在Rust中重寫他們的MacOS/iOS/TVOS應用程序。
Objective-C沒死嗎?
是的,否。
的確,Apple肯定有利於Swift,這是有充分理由的(我將其作為Objective-C的毫不掩飾的愛好者)。話雖如此,如果我們沒有再有5年以上的支持,我會感到驚訝。蘋果很快就會貶值,但是刪除Objective-C運行時需要大量的時間和精力。也許Swiftui殺死了它,誰知道。可以想像,圍繞這些東西的包裝器應該使在時間時更容易交換基礎的UI後端。
要注意的一件事是,蘋果已經開始發布僅迅速的框架。對於您需要這些的情況,應該有可能進行鏈接和橋接的組合 - 這將告知如何在某個時候換掉基礎UI後端。
有些人也可能會譴責Objective-C緩慢。為此,我會注意到以下內容:
tl; dr可能很好,並且您的性能需求生鏽。
為什麼不只是包裹Uikit,然後依靠催化劑呢?
我還沒有看到催化劑感覺良好的單個應用程序。但是,目標是好的,如果達到似乎前進的道路(例如,蘋果只是殺死Appkit),那肯定是一種選擇。
您不能在這裡包裝所有特定於平台的行為...
正確的!每個UI控件都包含一個objc字段,您可以將其用作逃生艙口 - 如果控件不支持某些內容,則可以自由地落到Objection -C運行時並處理它。
您為什麼不使用綁定來自動生成這些東西?
為了最初的探索目的,我手工完成了大部分此操作,因為我想在承諾生成綁定之前找到一種非常適合生鏽模型的方法。現在,我已經有足夠的“工作”了,我可能會關注接下來的事情。
這與Swift項目Cacao有關嗎?
否。這個問題中提到的項目旨在繪製可可和烏基特(Uikit)的一部分以在Linux上運行,但在某些時候沒有看到活動(這也很酷!)。
開源項目命名於2020年,就像試圖購買.com域:一切都很好。幸運的是,多個項目可以共享一個名稱...因此,這就是在這裡發生的事情。
這不是欺騙銹對像模型嗎?
取決於您如何看待它。我個人不太在乎 - 這些平台的GUI層是支持某些類別產品的很難要求,並且放棄它們也意味著放棄經過戰鬥測試的工具,例如可訪問性和更深的OS集成。話雖如此,在內部,有一些努力試圖使事情尊重Rust的工作應該如何運作的模型。
您可以將其視為類似於GTK-RS。如果您想支持或嘗試更純淨的模型,請查看Druid之類的東西。 :)
根據MIT/MPL-2.0許可獲得雙重許可。有關更多信息,請參見此存儲庫中的適當文件。蘋果,Appkit,Uikit,Cocoa和其他商標是版權蘋果公司。
您可以在Twitter上關注我,也可以通過電子郵件向我發送不合適的問題。