前提・実現したいこと
Userクラスの中のlikeという配列をUserDefaultsで使おうとした時、likeのデコード処理でnilが入ってしまい、このようなエラーが発生してしまいます。この対処法を教えてもらえませんか?
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
ソースコード(データクラス)
import Foundation class User:NSObject, NSCoding { var UserName: String? var Email: String? var Password: String? var UserImage: NSData? var lives: String? var sex: String? var age: String? var colleage: String? var event: String? var eventName: String? var like = [String]() override init() { } //デコード処理 required init?(coder aDecoder: NSCoder) { UserName = aDecoder.decodeObject(forKey: "username") as? String Email = aDecoder.decodeObject(forKey: "email") as? String Password = aDecoder.decodeObject(forKey: "password") as? String UserImage = aDecoder.decodeObject(forKey: "userimage") as? NSData lives = aDecoder.decodeObject(forKey: "lives") as? String sex = aDecoder.decodeObject(forKey: "sex") as? String age = aDecoder.decodeObject(forKey: "age") as? String colleage = aDecoder.decodeObject(forKey: "colleage") as? String like = aDecoder.decodeObject(forKey: "like") as! [String] event = aDecoder.decodeObject(forKey: "event") as? String eventName = aDecoder.decodeObject(forKey: "eventname") as? String } //エンコード処理 func encode(with aCoder: NSCoder){ aCoder.encode(UserName, forKey: "username") aCoder.encode(Email, forKey: "email") aCoder.encode(Password, forKey: "password") aCoder.encode(UserImage, forKey: "userimage") aCoder.encode(lives, forKey: "lives") aCoder.encode(sex, forKey: "sex") aCoder.encode(age,forKey: "age") aCoder.encode(colleage, forKey:"colleage") aCoder.encode(like, forKey: "like") aCoder.encode(event, forKey: "event") aCoder.encode(eventName, forKey: "eventname") } } //現在のユーザーデータと指定している本のデータを格納するシングルトン final class NowUser{ static let shared = NowUser() var nowuser = User() var tapuser = User() var searchSwich: Bool = true private init() {} }
ソースコード(HomeViewController)
import UIKit class HomeViewController: UIViewController ,UICollectionViewDelegate, UICollectionViewDataSource{ var searchUsers = [User]() var user = User() var collectionView: UICollectionView! override func viewWillAppear(_ animated: Bool) { LoginCheck() searchUsers.removeAll() tabBarController?.tabBar.isHidden = false //検索用のsearchUsersと全てのユーザーを表示するusersをsearchSwichで分ける処理 if NowUser.shared.searchSwich == false { let searchUserDefaults = UserDefaults.standard if let storedSearchusers = searchUserDefaults.object(forKey: "searchusers") as? Data { if let unarchivesearchusers = NSKeyedUnarchiver.unarchiveObject(with: storedSearchusers) as? [User] { searchUsers.append(contentsOf: unarchivesearchusers) } } NowUser.shared.searchSwich = true }else{ let userDefaults = UserDefaults.standard if let storedusers = userDefaults.object(forKey: "users") as? Data { if let unarchiveusers = NSKeyedUnarchiver.unarchiveObject(with: storedusers) as? [User] { searchUsers.append(contentsOf: unarchiveusers) } } self.navigationItem.title = "検索" } collectionView.reloadData() } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white //NavigationBarの設定 let searchImageButton: UIBarButtonItem = UIBarButtonItem(image: UIImage(named:"search1"), style: UIBarButtonItemStyle.plain, target: self, action: #selector(Search(_:))) self.navigationItem.leftBarButtonItem = searchImageButton //CollectionViewの設定 let flowLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() flowLayout.itemSize = CGSize(width: 90, height: 120) flowLayout.minimumInteritemSpacing = 20.0 flowLayout.minimumLineSpacing = 20.0 flowLayout.sectionInset = UIEdgeInsetsMake(20,20,0,20) collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout) collectionView.backgroundColor = UIColor.white collectionView.register(HomeCustomCell.self, forCellWithReuseIdentifier: "HomeCustomCell") collectionView.delegate = self collectionView.dataSource = self self.view.addSubview(collectionView) } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return searchUsers.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeCustomCell", for: indexPath) as! HomeCustomCell cell.userNameLabel.text = searchUsers[indexPath.row].UserName cell.userImageView.image = UIImage(data: (searchUsers[indexPath.row].UserImage! as Data))?.resize(size: CGSize(width: 50, height: 50)) return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { NowUser.shared.tapuser = searchUsers[indexPath.row] navigationController?.pushViewController(ProfileViewController(), animated: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @objc func LoginCheck(){ if NowUser.shared.nowuser.Email == nil{ let nc = UINavigationController(rootViewController: LoginViewController()) self.present(nc, animated: true, completion: nil) } } @objc func Search(_ sender: UIButton){ self.present(SearchViewController(), animated: true, completion: nil) } } class HomeCustomCell: UICollectionViewCell { let userImageView: UIImageView = { let imageView = UIImageView() return imageView }() let userNameLabel: UILabel = { let label = UILabel() label.textColor = .white label.textAlignment = NSTextAlignment.center return label }() override func draw(_ rect: CGRect) { self.layer.cornerRadius = 10 self.layer.masksToBounds = true let viewHeight10 = self.contentView.frame.height / 10 let viewWidth22 = self.contentView.frame.width / 22 self.contentView.addSubview(userImageView) self.contentView.addSubview(userNameLabel) self.selectedBackgroundView = UIView(frame: self.bounds) self.selectedBackgroundView?.backgroundColor = .red userNameLabel.translatesAutoresizingMaskIntoConstraints = false userNameLabel.topAnchor.constraint(equalTo:contentView.topAnchor,constant: viewHeight10 * 7).isActive = true userNameLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true userNameLabel.widthAnchor.constraint(equalToConstant: viewWidth22 * 22).isActive = true userNameLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true userImageView.translatesAutoresizingMaskIntoConstraints = false userImageView.topAnchor.constraint(equalTo:contentView.topAnchor).isActive = true userImageView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true userImageView.widthAnchor.constraint(equalToConstant: viewWidth22 * 22).isActive = true userImageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true } }
ここを読み込む時にUserクラスを参照してエラーが起こりました
let userDefaults = UserDefaults.standard if let storedusers = userDefaults.object(forKey: "users") as? Data { if let unarchiveusers = NSKeyedUnarchiver.unarchiveObject(with: storedusers) as? [User] { //ここでUserクラスを参照した時にエラーが起こった searchUsers.append(contentsOf: unarchiveusers) } }
searchUsersはUser型の配列です!( var searchUsers = User )
回答1件
あなたの回答
tips
プレビュー