【问题标题】:Pass Image from UITabBarController to subview (Swift)将图像从 UITabBarController 传递到子视图(Swift)
【发布时间】:2014-11-18 08:36:17
【问题描述】:

我正在使用 Xcode 6swift

我正在尝试将image / UIImage 从我的UITabBarController 传递到其中一个子视图(选项卡)。 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 直接到第一个视图是否适用于我的情况?

非常感谢您的任何建议,我会尝试并返回我的发现。

【问题讨论】:

  • 您是否尝试在代码中放置断点并检查变量状态?例如在您的 VC 类中定义一些 - (void)setImage:(UIImage *)image 并检查处理。
  • 请看上面,我用的是swift。另外,我正在尝试在两个位置打印图像(请参见上面的代码),并且在这两个位置我都可以在控制台中看到图像尺寸(这表明可以从该位置正确访问图像)。我相信我试图将图像传递给子视图的方式会导致错误。谢谢你的回复。
  • VC1 可以访问吗?

标签: ios objective-c xcode swift xcode6


【解决方案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
  }
}

【讨论】:

  • 非常感谢您的回复。我将此添加到我的 DesignerTabBarController,但似乎无法访问 viewControllers。我还添加了一些大括号。查看我的错误:i.imgur.com/eSxbLSX.png
  • 再次感谢 Astoria,但仍然无法正常工作。请在此处查看我的代码和控制台调试(似乎我们回到了与原始代码相同的问题):i.imgur.com/4aM9jUp.png
  • @LucaV。尝试在controller.pickedImageView.image = passedImage 行上设置断点并检查controllerpickedImageView 中的哪一个是nil?您是否将pickImageView 插座连接到实际控制?
  • 控件链接正确。控制器返回正确的 id,但 controller.pickedImageView 返回 nil。奇怪...
  • 我怀疑以下几点:当从 UITabBarController 调用 passImage 时,子视图尚未完全加载(因此,链接的 pickImageView 返回 nil)。现在的问题是:如何延迟它,以便在子视图完全加载后调用它?
【解决方案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
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2011-04-27
    • 2016-03-03
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多