Я использую Xcode 6 с swift.

Я пытаюсь передать image / UIImage из моего UITabBarController в одно из вложенных представлений (вкладок). Само изображение передается в UITabBarController с помощью функции loadImage (которая, в свою очередь, вызывается другим UIViewController во время prepareForSegue).

//this is the tab bar controller
class DesignerTabBarController : UITabBarController{

    var pickedImage : UIImage = UIImage() //empty image

    var VC1: DesignerTabController = DesignerTabController.alloc()

        func loadImage(passedImage: UIImage){
            pickedImage = passedImage
            println(pickedImage) // image is accessible from here
        }

        override func viewDidLoad() {

        super.viewDidLoad()
            println(pickedImage) //image is accessible from here
            VC1.pickedImageView.image = pickedImage // this line gives "unexpectedly found nil when unwrapping optional"

        }


}

//this is the `UIViewcontroller` I want display the image (inside pickedImageView)
class DesignerTabController : UIViewController{

    @IBOutlet weak var pickedImageView: UIImageView!

}

Я понимаю, что мой способ передачи изображения из UITabBarController во вспомогательное представление не будет работать, даже если в Xcode не отображаются синтаксические ошибки (он предлагал pickImageView, когда я начал печатать, поэтому я думаю, что я действительно близко к решению).

Если невозможно передать данные из моего UITabBarController в (первое) подпредставление, как я могу передать данные непосредственно в первое подпредставление? Как я объяснил выше, я передаю изображение из другого представления с помощью prepareForSegue. Работает ли в моем случае prepareForSegue непосредственно к первому просмотру?

Большое спасибо за любые предложения, я попробую их и вернусь с моими выводами.

0
Camillo 18 Ноя 2014 в 11:36
Пробовали ли вы ставить точки останова в своем коде и проверять состояние переменных? Например, определите несколько - (void)setImage:(UIImage *)image в своем классе VC и проверьте обработку.
 – 
Daniyar
18 Ноя 2014 в 12:31
Пожалуйста, смотрите выше, я использую swift. Кроме того, я пытаюсь распечатать изображение в двух местах (см. код выше), и в обоих местах я вижу размеры изображения в консоли (что указывает на то, что изображение правильно доступно из этого места). Я считаю, что способ, которым я пытаюсь передать изображение в подвид, вызывает ошибку. Спасибо за ответ.
 – 
Camillo
18 Ноя 2014 в 12:37
Доступен ли VC1?
 – 
Daniyar
18 Ноя 2014 в 12:43

2 ответа

Лучший ответ

Решается с помощью viewDidLayoutSubviews () вместо viewDidLoad ()

См. ниже код моего рабочего решения:

class DesignerTabController : UIViewController{

@IBOutlet weak var pickedImageView: UIImageView!

@IBOutlet weak var labelTest: UILabel!

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

}

class DesignerTabBarController : UITabBarController{

var pickedImage : UIImage = UIImage()

func loadImage(passedImage: UIImage){
    pickedImage = passedImage
}

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

override func viewDidLayoutSubviews() {
    if let controller = viewControllers![0] as? DesignerTabController{
        controller.pickedImageView.image = pickedImage
    }
}

}
1
Camillo 18 Ноя 2014 в 14:13

Контроллер панели вкладок имеет свойство viewControllers. Просто выполните итерацию, чтобы проверить, какой контроллер относится к нужному вам классу.

func passImage(passedImage: UIImage)
{
  if viewControllers!.isEmpty{
    return
  }
  for index in 0...viewControllers!.count{
    if let controller = viewControllers[index] as? DesignerTabController
      controller.pickedImageView.image = passedImage
  }
}
1
Daniyar 18 Ноя 2014 в 13:19
Большое спасибо за ваш ответ. Я добавил это в свой DesignerTabBarController, но кажется, что viewControllers недоступен. Я также добавил несколько фигурных скобок. См. мою ошибку: i.imgur.com/eSxbLSX.png
 – 
Camillo
18 Ноя 2014 в 13:07
Еще раз спасибо, Астория, но все равно не получилось. Пожалуйста, посмотрите мой код и отладку консоли здесь (похоже, мы вернулись к той же проблеме, что и с моим исходным кодом): i .imgur.com/4aM9jUp.png
 – 
Camillo
18 Ноя 2014 в 13:34
@ЛукаВ. попробуйте установить точку останова на строке controller.pickedImageView.image = passedImage и проверить, какие из controller, pickedImageView равны нулю? Вы подключили выход pickImageView к реальному управлению?
 – 
Daniyar
18 Ноя 2014 в 13:45
Управление подключено правильно. контроллер возвращает правильный идентификатор, но controller.pickedImageView возвращает ноль. странный...
 – 
Camillo
18 Ноя 2014 в 13:49
1
Я подозреваю следующее: когда passImage вызывается из UITabBarController, подпредставление еще не полностью загружено (следовательно, связанный pickImageView возвращает nil). Теперь вопрос: как отложить его, чтобы он вызывался после полной загрузки подпредставления?
 – 
Camillo
18 Ноя 2014 в 14:08