如果我等到fetchUser()
完成viewDidLoad()
的加载后,将图像添加到自定义选项卡中,我就绝迹了
func fetchUser() {
guard let username = UserDefaults.standard.string(forKey: "name") else {return}
guard let uid = Auth.auth().currentUser?.uid else {return}
let userRef = Database.database().reference(withPath: "users").child(uid)
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
self.usernameLable.text = username
guard let profileImageUrl = value?["profileImageUrl"] as? String else {return}
guard let url = URL(string: profileImageUrl) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
if let err = err {
print("unable to get profile image", err)
}
guard let data = data else {return}
let image = UIImage(data: data)
DispatchQueue.main.async {
self.ProfileImg.image = image
self.tabBarController?.addSubviewToLastTabItem(image!.withRenderingMode(.alwaysOriginal))
}
}.resume()
}) { (err) in
print("fail to fetch user", err)
}
}
但是,如果我用胶带贴在另一个标签栏项上,我将收到此错误Thread 1: Exception: "*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]
,应用程序将崩溃,并且我只是想办法确定问题是否在这里self.tabBarController?.addSubviewToLastTabItem(image!.withRenderingMode(.alwaysOriginal))
,我想我没有以正确的方式添加图片
extension UITabBarController {
func addSubviewToLastTabItem(_ imageName: UIImage) {
let lastTabBarButton = self.tabBar.subviews[1]
let tabItemImageView = lastTabBarButton.subviews[1]
if let accountTabBarItem = self.tabBar.items?.first {
accountTabBarItem.selectedImage = nil
accountTabBarItem.image = nil
}
self.tabBar.unselectedItemTintColor = UIColor.lightGray
let imgView = UIImageView()
imgView.image?.withRenderingMode(.alwaysOriginal)
imgView.frame = tabItemImageView.frame
imgView.layer.cornerRadius = tabItemImageView.frame.height/2
imgView.layer.masksToBounds = true
imgView.contentMode = .scaleAspectFill
imgView.clipsToBounds = true
imgView.image = imageName
self.tabBar.subviews.last?.addSubview(imgView)
}
}