Swift: невозможно изменить изображения во всплывающем окне - PullRequest
0 голосов
/ 26 мая 2018

Новичок Swift-пользователь здесь.Я хочу открыть всплывающее окно, подключенное к отдельному контроллеру вида (P2_Gift_Pop_Up) из контроллера основного вида.С этой целью я включаю следующее во фрагмент кода в моем главном контроллере представления

let vc = P2_Gift_Pop_Up()
vc.modalPresentationStyle = .overCurrentContext 
present(vc, animated: true, completion: nil)

Это запускает запуск кода во всплывающем окне (оператор печати работает в любом случае), так что пока все хорошо.

Однако, когда я пытаюсь изменить некоторые элементы в представлении, подключенном к контроллеру представления, я получаю

Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения.Вот код целиком.

import UIKit

class P2_Gift_Pop_Up: UIViewController {

    @IBOutlet weak var Slot1: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        Slot1.setImage(UIImage(named: "Card 2 Red"), for: .normal)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

Хотя у меня есть (через другой ответ на этом сайте) понимание того, что означает сообщение, я не понимаю, почему я получаю его в этомконтекст, и как это исправить.Также может быть подчеркнуто, что, хотя код запускается после вызова P2_Gift_Pop_Up, соответствующее представление не отображается.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

@ JogendarChoudhary сказал вам, что делать, но на самом деле не объяснил, почему.

Когда вы создаете P2_Gift_Pop_Up с помощью

let vc = P2_Gift_Pop_Up()

Вы неправильно инициализируете его.У него нет возможности загрузить свои представления из файла / раскадровки XIB.

Предполагая, что ваш контроллер представления определен в раскадровке основного приложения, вам необходимо загрузить контроллер представления из раскадровки.

Вы должны добавить уникальный идентификатор к вашему контроллеру представления в раскадровке, а затем загрузить его, используя этот идентификатор.(Использование имени класса в качестве идентификатора является хорошим выбором для любого.)

Класс UIViewController имеет свойство storyboard, которое будет содержать раскадровку, из которой он загружен.Обычно это основная раскадровка вашего приложения и то, что вы хотите.Таким образом:

if let vc = storyboard?.instantiateViewController(withIdentifier: "P2_Gift_Pop_Up id") 
    as? P2_Gift_Pop_Up {
  vc.modalPresentationStyle = .overCurrentContext 
  present(vc, animated: true, completion: nil)
} else {
  print("error creating P2_Gift_Pop_Up")
}
0 голосов
/ 26 мая 2018

Вам необходимо представить свой контроллер следующим образом (вам нужно установить идентификатор раскадровки, а затем добавить его в идентификатор):

    let storyBoard = UIStoryboard(name: "main", bundle: Bundle.main)
    let vc = storyBoard.instantiateViewController(withIdentifier: "your storyboard id") as! P2_Gift_Pop_Up
    vc.modalPresentationStyle = .overCurrentContext
    present(vc, animated: true, completion: nil)

Ваше приложение падает, потому что у вашей кнопки (Slot1) нетпамяти, так что вам нужно представить, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...