我想在目标视图控制器的"配置文件"按钮上显示图像,但是当我试图从源视图控制器分配映像时,它正在崩溃,因为我的" proficpicpicbutton"为nil。/p>
let cell = tableView.cellForRow(at: indexPath) as! FacebookTableViewCell
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let objFriendsDetailViewController = storyBoard.instantiateViewController(withIdentifier: "FriendsDetailViewController") as! FriendsDetailViewController
objFriendsDetailViewController.friendsName = cell.friendsName.text! //Can Assign Data to the property "friendsName"
objFriendsDetailViewController.remindersDataDict = ["birthDay":cell.friendsBirthDay.text!] //Can Assign Data to the property "remindersDataDict"
let image = cell.profilePicButton.image(for: .normal)
print(objFriendsDetailViewController)
print(objFriendsDetailViewController.remindersTableView) //It says nil
print(objFriendsDetailViewController.profilePicButton) //It says nil
objFriendsDetailViewController.profilePicButton.setImage(image, for: .normal) //Can't Assign Image to the property "profilePicButton"
self.navigationController?.pushViewController(objFriendsDetailViewController, animated: true)
如何将图像从源视图控制器设置为目标视图控制器中的按钮?
目的地视图控制器的UI组件是在触发push
时未设置。UI组件的实际位置位于 set 模式下是您的视图控制器的viewDidLoad()
。因此,您正在尝试在UI实际上从未设置到 set 状态之前设置图像。并且您的Button
是隐式解开的可选可选的,它告诉,如果在初始化之前访问或在值为nil为nil nil 的情况下访问,则
现在,这不是实现自己尝试的方法。这样做的实际方法是:
- 在目标视图控制器上有一个属性
- 初始化目标视图控制器 时,将对象传递到该属性
- 当目标视图控制器准备就绪时(本质上是
viewDidLoad()
(,您可以使用该属性更新相应的视图
let image = cell.profilePicButton.image(for: .normal)
print(objFriendsDetailViewController)
print(objFriendsDetailViewController.remindersTableView) //It says nil
print(objFriendsDetailViewController.profilePicButton) //It says nil
//These are nil because Controller from storyboard does come into memory yet
objFriendsDetailViewController.imageFromPreviousButton = image
self.navigationController?.pushViewController(objFriendsDetailViewController, animated: true)
而不是你可以做
Class FriendsDetailViewController: UIViewController {
var imageFromPreviousButton = UIImage()
@IBOutlet var profilePicButton: UIButton!
Override func viewDidLoad() {
profilePicButton.setImage(imageFromPreviousButton, for: .normal)
}
}