介绍:
小部件是一种有力的方法,可以在其iPhone的主屏幕或今天查看中为用户提供可查看应用程序信息的视图。使用iOS 14及以后,您可以创建自己的自定义小部件,以浏览一下提供有用的信息。在本教程中,我们将带您创建一个货币汇率小部件,该货币汇率小部件从API获取数据并将其显示在小部件上。我们将使用PrivatBank的端点来检索UHAH的汇率和EUR的汇率。
先决条件:
- Xcode(最新版本)
- MacOS具有最新版本的Swiftui
- 对Swiftui和Swift编程语言的基本理解
- 活跃的Apple开发人员帐户
让我们开始!
1。创建一个新的Xcode项目:
打开Xcode并使用“ iOS”下的“应用”模板创建一个新项目。给您的项目一个名称,例如“私人交换”,然后选择“ swiftui”作为界面,而“ swift”作为语言。将最小部署目标设置为iOS 14或更晚,因为在早期版本中不支持小部件。
2添加新的小部件扩展名:
在Xcode项目导航器中,单击“文件”>“ new”>“ Target”。选择“小部件扩展”模板,然后单击“下一步”。给您的小部件扩展名称,例如“ PrivateExchangeWidget”,并确保“语言”设置为“ Swift”。单击“完成”以创建小部件扩展名。
3。为货币利率创建数据模型:
在窗口小部件扩展文件夹中,创建一个名为“ crurineRate.swift”的新快文件,并定义符合Decodable
协议的CurrencyRate
struct。该结构将代表从API获取的货币利率数据。
struct CurrencyRate: Decodable {
let ccy: String
let base_ccy: String
let buy: String
let sale: String
}
4。创建一个数据fetcher从API获取货币率:
在同一文件夹中,创建另一个称为“ CurrenceRateFetcher.swift”的Swift文件,并使用共享Singleton实例定义CurrencyRateFetcher
类。该课程将负责从API获取货币利率。
import Foundation
class CurrencyRateFetcher {
static let shared = CurrencyRateFetcher()
private let apiUrl = "https://api.privatbank.ua/p24api/pubinfo?exchange&coursid=5"
func fetchRates(completion: @escaping ([CurrencyRate]?) -> Void) {
guard let url = URL(string: apiUrl) else {
completion(nil)
return
}
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
completion(nil)
return
}
let decoder = JSONDecoder()
let currencyRates = try? decoder.decode([CurrencyRate].self, from: data)
completion(currencyRates)
}
task.resume()
}
}
5。修改小部件的时间轴提供商以获取数据(续):
更新getTimeline(for:in:completion:)
方法以从API获取货币利率并将其传递给SimpleEntry
。
func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
CurrencyRateFetcher.shared.fetchRates { currencyRates in
let currentDate = Date()
let entry = SimpleEntry(date: currentDate, currencyRates: currencyRates)
let refreshDate = Calendar.current.date(byAdding: .hour, value: 1, to: currentDate)!
let timeline = Timeline(entries: [entry], policy: .after(refreshDate))
completion(timeline)
}
}
此代码获取货币利率,并以当前日期和获取费率创建时间轴条目。时间轴策略设置为.after(refreshDate)
,该策略每小时都会刷新数据。
6。更新小部件的视图以显示货币汇率:
打开小部件的主要Swift文件(例如“ Private_exchange.swift”),然后修改Private_ExchangeEntryView
以在SwiftUI视图中显示货币汇率。
struct Private_ExchangeEntryView : View {
var entry: Provider.Entry
private func currencySymbol(for code: String) -> String {
switch code {
case "EUR":
return "€"
case "USD":
return "$"
case "UAH":
return "₴"
default:
return code
}
}
var body: some View {
VStack {
if let currencyRates = entry.currencyRates {
ForEach(currencyRates, id: \.ccy) { rate in
HStack {
Text("\(currencySymbol(for: rate.ccy))")
Spacer()
Text("\(Double(rate.buy)?.rounded(toPlaces: 2) ?? 0) / \(Double(rate.sale)?.rounded(toPlaces: 2) ?? 0)")
}
}
} else {
Text("Loading...")
}
}
.padding()
}
}
此代码定义了currencySymbol(for:)
函数,该功能返回给定货币代码的适当货币符号。该视图显示使用VStack
和ForEach
的货币汇率列表,或“加载...”文本(如果尚不可用)。
7。测试小部件:
在iOS模拟器或物理设备上构建并运行项目,以查看货币汇率小部件的行动。您可以通过遵循在iOS上添加小部件的标准过程。
,将小部件添加到主屏幕或今天查看。结论:
在本教程中,我们带领您通过使用SwiftUI和API为iOS创建自定义货币汇率小部件。现在,您可以扩展此基本实现,以添加更多功能,例如用户可配置的货币对或小部件的不同显示样式。愉快的编码!