-
SwiftUI 變量觸發界面刷新
1.關於ObservableObject,Published和EnvironmentObject三個關鍵字的含義理解
2.兩種方法觸發界面刷新,方法一,如下
class UserOnboard: ObservableObject {
@Published var onboardComplete : Bool = false
}
方法二:不帶關鍵字 Published,在屬性發生變化是,該屬性的類調用objectWillChange.send(),通知界面刷新
觸發刷新的代碼:
struct StartOnboardView: View {
@EnvironmentObject var userOnboard: UserOnboard
var body: some View {
let contentView = StartView()
let settings = UserSettings()
if userOnboard.onboardComplete {
return AnyView(contentView.environmentObject(settings))
} else {
if UserDefaults.standard.bool(forKey: "Loggedin") {
settings.loggedIn = true
return AnyView(TabbarVC())
} else {
settings.loggedIn = false
return AnyView(OnboardingView())
}
}
}
}
相關問題可以參考Stack Overflow:NSManagedObject changes do not trigger objectWillChange,I'm trying to use “objectWillChange.send()” in an protocol extension but it's not working, any idea why?,SwiftUI ObservableObject used as EnvironmentObject odd behaviour
僅以此做個記錄,備忘
PS,像這種剛剛(也不叫剛剛)出來的技術和屬性,國內很少有說明和解釋的博客,估計過幾年各種博客搬運,都要氾濫了
-
List
在 UIKit 中對應的是UITableView
-
閉包相關
List {
Text("Static row 1")
Text("Static row 2")
ForEach(0..<5) {
Text("Dynamic row \($0)")
}
Text("Static row 3")
Text("Static row 4")
}
舉例說明list的簡單用法,順便引出閉包的相關問題
上面的ForEach 可以理解爲簡單的閉包
List {
Text("Static row 1")
Text("Static row 2")
ForEach(0..<5) {(index:int)->void in
Text("Dynamic row \(index)")
}
Text("Static row 3")
Text("Static row 4")
}
Another example:
let array = ["1", "2", "3", "4", "5"]
array.forEach { (element) in
print(element)
}
閉包表達式的一般格式
{ (parameters) -> (return type) in
statements
}
幾種簡寫
/* 原始閉包寫法 */
//從數組中篩選指出合適的數據組成新的數組
func getList(score:[Int], con:(Int)->Bool) -> [Int]{
var newScore:[Int] = [Int]()
for item in score {
if con(item) {
newScore.append(item)
}
}
return newScore
}
let newAarray = getList(score: [75,60,95,45,85], con:{(s:Int)->Bool in return s>80})
print(newAarray)
/* 簡寫一 */
let newAarray = getList(score: [75,60,95,45,85], con:{(s:Int) in return s>80})
/* 簡寫二 */
let newAarray = getList(score: [75,60,95,45,85], con:{s in return s>80})
/* 簡寫三 */
let newAarray = getList(score: [75,60,95,45,85], con:{s in s>80})
/* 簡寫四 */
let newAarray = getList(score: [75,60,95,45,85], con:{$0>80})
-
Swift解包
var num: Int?
這是Optional的聲明,意思不是"我聲明瞭一個Optional的Int值",而是”我聲明瞭一個Optional類型值,它可能包含一個Int值,也可能什麼都不包含”,也就是說實際上我們聲明的是Optional類型,而不是聲明瞭一個Int類型!
//if let 解包
func getHeight(_ height: Float?) -> Float? {
if let unwrapedHeight = height {
return unwrapedHeight / 100
}
return nil
}
//guard let解包
func getHeight(_ height: Float?) -> Float? {
guard let unwrapedHeight = height else {
return nil
}
return unwrapedHeight / 100
}