Передача изображения в другой контроллер просмотра (Swift)
Я пытаюсь переместить загруженное пользователем изображение из одного UIImageView в другой UIImageView на другой контроллер просмотра. Я могу загрузить изображение пользователя и сохранить его в первом UIImageView, но после нажатия кнопки "Опубликовать" UIImageView на следующем контроллере представления остается пустым.
Примечание: browsingImage - это имя UIImageView на втором контроллере представления (целевой UIImageView)
Любая помощь будет принята с благодарностью!
@IBAction func cameraButton(sender: AnyObject) {
addNewPicture()
}
func addNewPicture() {
let picker = UIImagePickerController()
picker.allowsEditing = true
picker.delegate = self
presentViewController(picker, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
postingImage.image = image
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func postButton(sender: AnyObject) {
performSegueWithIdentifier("toBrowsePage", sender: nil)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "toBrowsePage" {
var itemToAdd = segue.destinationViewController as! ListPage
itemToAdd.postingImage.image = browsingImage.image
}
}
Ответы
Ответ 1
При prepare(for:)
вы не можете получить доступ к @IBOutlet
представления назначения, потому что они еще не были настроены. Вы должны назначить изображение свойству конечного контроллера представления, а затем переместить его на место в viewDidLoad()
:
В контроллере вида источника:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toBrowsePage" {
let dvc = segue.destination as! ListPage
dvc.newImage = postingImage.image
}
}
В контроллере вида назначения:
class ListPage: UIViewController {
@IBOutlet weak var browsingImage: UIImageView!
var newImage: UIImage!
override func viewDidLoad() {
super.viewDidLoad()
browsingImage.image = newImage
}
}
Ответ 2
Из вашего описания browsingImage
находится в viewController назначения, поэтому
в этой строке
itemToAdd.postingImage.image = browsingImage.image
Передача целевого изображения в исходное изображение
Ответ 3
IBOutlets недоступны в вашем текущем контроллере. Выходы еще не инициализированы, так как ваше второе представление еще не загружено.
Вместо этого вы можете создать переменную UIImage во втором viewController и присвоить ей значение в файле prepareForSegue.
И во втором viewController viewDidLoad метод присваивает это значение вашей розетке ImageView.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "toBrowsePage" {
let destination = segue.destinationViewController as! ListPage
destination.receivedImage = postingImage.image
}
}
В следующем viewController объявите переменную с именем
@IBOutlet weak var postingImage: UIImageView!
var receivedImage : UIImage?
В методе viewDidLoad
postingImage.image = receivedImage
Ответ 4
Во время Segue
, ваш UIImageView не инициализируется, поэтому вы не можете назначить ему изображение, лучше всего было бы передать UIImage
и инициализировать ваш UIImageView
в viewDidLoad
.
поэтому в вашем классе ListPage
введите свойство типа UIImage
измените строку prepareForSegue
как
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "toBrowsePage" {
var itemToAdd = segue.destinationViewController as! ListPage
itemToAdd.image = browsingImage.image
}
}
в viewDidLoad
или viewDidAppear
вашего пункта назначения viewController
вы сделаете что-то вроде этого
browsingImage.image = image