Не удается передать изображение при нажатии ViewController - PullRequest
1 голос
/ 05 июня 2019

У меня есть tableView, в котором есть imageView и метка, когда я выбираю ячейку, я хочу нажать другой viewController и показать в нем мою выбранную ячейку imageView.image и label.text, но есть ошибка, которая (Неожиданно найдено ноль, поканеявное развертывание необязательного значения) в строке изображения

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController
    vc?.pushedImage.image = UIImage(named: imagesArray[indexPath.row])
    vc?.pushedLabel.text = imagesArray[indexPath.row]
    self.navigationController?.pushViewController(vc!, animated: true)
}

неожиданно найденный ноль при неявном развертывании необязательного значения

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

В вашем первом представлении контроллер selectedImage и selectedText будут равны нулю в методе tableView didSelectRowAt. IBOutlet s будут инициированы только после того, как вы нажмете второй контроллер вида. Поэтому создайте переменные UIImage и String во втором контроллере представления и отправьте значения этим переменным. Во втором представлении метод viewDidLoad контроллера присваивает переданные значения IBOutlet s.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController
    //vc?.pushedImage vc?.pushedLabel are nil
    vc?.selectedImage = UIImage(named: imagesArray[indexPath.row])
    vc?.selectedText = imagesArray[indexPath.row]
    self.navigationController?.pushViewController(vc!, animated: true)
}

PushedViewController

class PushedViewController: UIViewController {
    @IBOutlet weak var pushedLabel: UILabel!
    @IBOutlet weak var pushedImage: UIImageView!
    var selectedImage: UIImage?
    var selectedText: String?
    override func viewDidLoad() {
        super.viewDidLoad()
        //vc?.pushedImage vc?.pushedLabel are not nil
        pushedImage.image = selectedImage
        pushedLabel.text = selectedText
    }
}
0 голосов
/ 05 июня 2019

Компоненты пользовательского интерфейса еще не инициализированы, поэтому вы не можете получить к ним доступ сразу после инициализации контроллера.

Я бы предложил вам иметь локальную переменную в PushedViewController для хранения изображения и текста.и затем назначьте их в viewDidLoad.

Примерно так:

class PushedViewController: UIViewController {
    //..
    var image:UIImage?
    var text:String?
    //..
    override viewDidLoad() {
        super.viewDidLoad()
        //..
        if let image = self.image {
            self.imageView.image = image
        }
        if let text = self.text {
            self.label.text = text
        }
        //..
    }
    //..
}

Затем установите те свойства, из которых вы нажимаете контроллер:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController else { return }
    // Assign the properties here
    vc.image = UIImage(named: imagesArray[indexPath.row])
    vc.text = textsArray[indexPath.row]
    self.navigationController?.pushViewController(vc, animated: true)
}
0 голосов
/ 05 июня 2019

вы опубликовали не слишком много, но кажется, что строка сбоя

self.navigationController?.pushViewController(vc!, animated: true)

вы уверены, что storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController не nil?

возможно PushedViewController не в той же раскадровке.В любом случае, просто поместите его в guard let, чтобы развернуть опциональный

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let vc = storyboard?.instantiateViewController(withIdentifier: "PushedViewController") as? PushedViewController else { //fallback goes here return }
    vc.pushedImage.image = UIImage(named: imagesArray[indexPath.row])
    vc.pushedLabel.text = imagesArray[indexPath.row]
    self.navigationController?.pushViewController(vc, animated: true)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...