该库为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上关注我,也可以通过电子邮件向我发送不合适的问题。