将图像从UITabBarController传递到子视图(Swift)

时间:2014-11-18 08:36:17

标签: ios objective-c xcode swift xcode6

我将Xcode 6swift一起使用。

我正在尝试将image / UIImageUITabBarController传递到其中一个子视图(标签)。 Image本身正在使用loadImage函数传递给UITabBarController(在prepareForSegue期间由另一个UIViewController调用它)。

//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 个答案:

答案 0 :(得分:1)

您的标签栏控制器具有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 :(得分:1)

使用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
    }
}

}