本文為 Eul 樣章,如果您喜歡,請移步 AppStore/Eul 檢視更多內容。
Eul 是一款 SwiftUI & Combine 教程 App(iOS、macOS),以文章(文字、圖片、程式碼)配合真機示例(Xcode 12+、iOS 14+,macOS 11+)的形式呈現給讀者。筆者意在儘可能使用簡潔明瞭的語言闡述 SwiftUI & Combine 相關的知識,使讀者能快速掌握並在 iOS 開發中實踐。
自定義 Modifier
SwiftUI 提供了許多內建的 Modifier(修飾器),我們可以方便地呼叫。但是系統提供的有一定的侷限性,如果我們需要自定義 Modifier,該如何實現呢?
設想有如下需求場景:在某個使用者的名字右邊,如果他是 Vip,顯示 Vip 標識,如果不是,顯示開通會員的按鈕。如果我們能自定義一個 isVip 這樣的 Modifier 可以方便的呼叫和展示差異化檢視,那該是極好的。
首先,我們要實現自定義的 Modifier,需要實現 ViewModifier 協議:
struct Vip: ViewModifier {
let isVip: Bool
func body(content: Content) -> some View {
HStack {
content
if isVip {
Text("Vip")
.font(.caption).bold()
.foregroundColor(.white)
.padding(3)
.background(Color.orange)
.cornerRadius(3)
} else {
Button {
// action
} label: {
Text("開通會員")
.font(.caption)
.foregroundColor(.white)
.padding(5)
.background(Color.blue)
.clipShape(Capsule())
}
.buttonStyle(BorderlessButtonStyle())
}
}
}
}
.buttonStyle(BorderlessButtonStyle())
的作用是為了讓按鈕在列表中,只有按鈕可以響應點選事件。
然後我們給 View 新增擴充套件:
extension View {
func isVip(_ isVip: Bool) -> some View {
self.modifier(Vip(isVip: isVip))
}
}
接下來我們就可以方便的使用了:
Text("Bruce").isVip(false)
// 或
Text("Bruce").isVip(true)
本文為 Eul 樣章,如果您喜歡,請移步 AppStore/Eul 檢視更多內容。