Я использую 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 непосредственно к первому просмотру?
Большое спасибо за любые предложения, я попробую их и вернусь с моими выводами.
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
}
}
}
Контроллер панели вкладок имеет свойство 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
}
}
controller.pickedImageView.image = passedImage
и проверить, какие из controller
, pickedImageView
равны нулю? Вы подключили выход pickImageView к реальному управлению?
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.
- (void)setImage:(UIImage *)image
в своем классе VC и проверьте обработку.