2017-10-21 29 views
0

我試圖拒絕訪問某個視圖控制器,如果userDefault爲空,但代碼似乎不工作。爲了更清楚一點,我將一個收藏列表保存到userDefault。這是我的代碼:如何檢查userDefault是否爲空?

if UserDefaults.standard.array(forKey: "favorites") == nil { 

     navigationController?.popToRootViewController(animated: true) 
     return 
    } 

誤差是指數超出範圍,這意味着整個塊被忽略(代碼塊運行後,因爲用戶默認爲空它試圖檢索信息時,崩潰是不在那裏)。

有趣的是,代碼第一次嘗試進入viewController(它拒絕我訪問)。但如果我最喜歡標記一個對象(保存到userDefault),然後取消收藏同一個對象(userDefault變爲空),並進入viewController,程序將崩潰。

我曾嘗試:

if let favExist = UserDefaults.standard.array(forKey: "favorites") { 
     print("") 
     print("FAV EXISTS") 
     print("") 

    }else { 
     print("") 
     print("NOPE") 
     print("") 
     navigationController?.popToRootViewController(animated: true) 
     return 
    } 

...和相同的問題仍然存在。在print()中,日誌告訴我FAV EXISTS在我最喜歡的標記之後,然後是不喜歡的標記,然後嘗試訪問頁面(即使userDefault現在應該是空的)。

我也嘗試了其他線程的代碼。從另一個線程解決我的問題的建議代碼是:

let defaults = UserDefaults.standard 

    if (!defaults.bool(forKey: "favorites")) { 
     defaults.set(true, forKey: "favorites") 
    } 

我真的不知道如何實現它,但?我在哪裏使用這個?它有什麼作用?

任何想法有什麼不對?

+1

的可能的複製[如何檢查單的時間,如果UserDefaults是空的(https://stackoverflow.com/questions/38340958/how-to-check-a-single-time-if -userdefaults-is-empty) –

+0

你是不是指'如果UserDefaults.standard.array(forKey:「favorites」)!= nil {'?如果根控制器需要以用戶默認值存儲的數組,則應該檢查它是否爲nil –

+0

您還應該查看nil合併運算符並註冊默認值https://developer.apple.com/documentation/foundation/userdefaults/1417065-寄存器 –

回答

1

It's足以做到這一點:

if let favorites = UserDefaults.standard.array(forKey: "favorites") { 
    // userDefault has a value 
} else { 
    // userDefault is nil (empty) 
} 

更新:
你需要做的if語句中的檢查,如果你有arrat任何值過:

if let favorites = UserDefaults.standard.array(forKey: "favorites") { 
    print("Favorites exists") 

    if favorites.count == 0 { 
     print("Favorites is empty") 
    } else { 
     print("Favorites is not empty, it has \(favorites.count) items") 
    } 
} else { 
    print("Favorites is nil") 
} 
+0

謝謝,但它給了我同樣的錯誤。查看更新的問題:) –

+0

@JoakimSjöstedt,檢查我所做的更新。你也需要做一個計數檢查。 –

+0

@JoakimSjöstedt,這個更新對你有幫助嗎? –

0

當您設置UserDefaults數組時,還將BOOL設置爲UserDefaults。當你恢復Bool時,即使它沒有被設置,它也不會崩潰。

var favouritesset = UserDefaults.standard.bool(forKey: "favoritesset") 

if favouritesset == true { 
//Then Recover the Array 
var array = UserDefaults.standard.array(forKey: "favorites") 
} 
+0

array(forKey :)已經返回一個可選值。爲什麼他需要有一個不同的鍵來存儲一個布爾值,只有這個鍵? –

+0

我不明白。當'favouriteset'爲false時,它不會查找數組,當它是真的時它會看起來。由於布爾值爲true,所以必須設置數組。 –

0

好的,Rashwan L爲我解決了它。事情是,我的代碼(和其他人建議的代碼)檢查userDefault是否存在 - 它沒有打擾存儲或不存儲值。要解決該問題,我必須測試favExist.count == 0是否爲true。如果爲true,則用戶被阻止訪問該頁面,並阻止訪問其餘的代碼。參見下文:

if let favExist = UserDefaults.standard.array(forKey: "favorites") { 
     if(favExist.count == 0) 
     { 
      navigationController?.popToRootViewController(animated: true) 
      return 
     } 

    }else { 
     navigationController?.popToRootViewController(animated: true) 
     return 
    }