【问题标题】:UIImage name from array keeps returning nil value.数组中的 UIImage 名称不断返回 nil 值。
【发布时间】:2016-04-11 22:33:28
【问题描述】:

在容器内设置页面视图。遵循我能找到的所有说明(初学者)。

这两个数组位于主视图控制器中,其中包含我要填充页面的图像名称。

self.shirtImage = NSArray(objects: "shirt1", "shirt2")
self.pantsImage = NSArray(objects: "pants1", "pants2")

每当我运行程序时,这两行代码:

self.todayShirt.image = UIImage(named: self.shirtName)
self.todayPants.image = UIImage(named: self.pantsName)

返回错误fatal error: unexpectedly found nil while unwrapping an Optional valueCUICatalog: Invalid asset name supplied:,这意味着它们以某种方式从数组中接收到 nil 值。

页面内容类如下所示:

class TodayPicksViewController: UIViewController {

@IBOutlet weak var todayShirt: UIImageView!
@IBOutlet weak var todayPants: UIImageView!

var pageIndex: Int!
var shirtName: String!
var pantsName: String!

override func viewDidLoad() {
    super.viewDidLoad()

    self.todayShirt.image = UIImage(named: self.shirtName)
    self.todayPants.image = UIImage(named: self.pantsName)

主视图控制器是这样设置的:

class ViewController: UIViewController, UIPageViewControllerDataSource {

var pageViewController: UIPageViewController!
var shirtImage: NSArray!
var pantsImage: NSArray!

override func viewDidLoad() {
    super.viewDidLoad()

    self.shirtImage = NSArray(objects: "shirt1", "shirt2")
    self.pantsImage = NSArray(objects: "pants1", "pants2")

    self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
    self.pageViewController.dataSource = self

    let startVC = self.viewControllerAtIndex(0) as TodayPicksViewController
    let viewControllers = NSArray(object: startVC)

    self.pageViewController.setViewControllers((viewControllers as! [UIViewController]), direction: .Forward, animated: true, completion: nil)


    self.pageViewController.view.frame = CGRectMake(0, 30, self.view.frame.width, self.view.frame.height - 60)

    self.addChildViewController(self.pageViewController)
    self.view.addSubview(self.pageViewController.view)
    self.pageViewController.didMoveToParentViewController(self)

}

func viewControllerAtIndex(index: Int) -> TodayPicksViewController {
    if ((self.shirtImage.count == 0) || index >= self.shirtImage.count){
        return TodayPicksViewController()
    }

    let vc: TodayPicksViewController = self.storyboard?.instantiateViewControllerWithIdentifier("TodayPicksViewController") as! TodayPicksViewController
    vc.shirtName = self.shirtImage[index] as! String
    vc.pantsName = self.pantsImage[index] as! String
    vc.pageIndex = index


    return vc
}

我有另一个项目,它有一个与此类似的工作页面视图,并且一切正常,我已经完全复制了几乎所有内容,所以我无法弄清楚为什么主视图控制器的值没有正确传递到页面视图这个。任何帮助表示赞赏。

【问题讨论】:

  • @Paulw11 我不确定我是否跟随。我应该怎么做?
  • @andrewxt 我认为您在将图像设置为 UIImageView 时遇到了问题(即设置图像的语法错误),或者您的图像命名存在问题(您可能没有正确命名所有图像)。我在下面回答了这个问题,只要按照我说的去做!它应该有帮助,如果没有,请告诉我。
  • @Paulw11 你的意思是在主视图控制器中还是在页面内容视图控制器中?
  • 我认为您可能正在以低于标准的方式制作该数组。这是我的下一个想法:)。在下面查看我修改后的解决方案。基本上,您将删除所有 NSArray 内容并在 viewdidload() 之外创建两个新的 NSMutableArrays。

标签: ios swift uiimage swift2 uipageviewcontroller


【解决方案1】:

我想我已经找到了你的问题,你的代码是在这个 if 语句中输入的吗?

if ((self.shirtImage.count == 0) || index >= self.shirtImage.count){
    return TodayPicksViewController()
}

如果是这样,shirtNamepantsName 将永远不会被初始化。

【讨论】:

  • 我以为我在主视图控制器的viewControllerAtIndex 方法中给了它们值。我是否需要在其他位置为它们赋值?
  • 你是对的,但我想我现在发现了问题,我编辑了我的答案。
  • 我尝试注释掉 if 语句以查看它是否会返回 vc 但我得到了同样的错误。我不确定它是否有所不同,但页面视图在容器内。如果它意味着什么,那么大部分代码都来自这个video
【解决方案2】:

更改 UIImageView 的图像时出现问题。试试todayShirt.image = UIImage(imageLiteral: "\(shirtName)")todayPants.image = UIImage(imageLiteral: "\(pantsName)")

然后非常确定您在 XCode 项目中插入了 4 张图像:shirt1.pngshirt2.pngpants1.pngpants2.png。如果是shirt1.jpg等也可以。

如果这仍然没有帮助,请尝试更改您的数组创建方法。而不是使用 NSArray 并且只在 viewdidload() 部分中添加对象,只需在全局范围内创建数组并添加对象。所以,现在你有var shirtImage: NSArrayvar shirtImage: NSArray,删除这两个并添加var shirtsArray:NSMutableArray = ["shirt1", "shirt2"]var pantsArray:NSMutableArray = ["pants1", "pants2"]

【讨论】:

  • 感谢您的回复。我在项目中有正确的资产。此外,当我尝试使用 imageLiteral 行时,Xcode 坚持要在其末尾添加无穷无尽的逗号。不确定是 IDE 错误还是其他问题。
  • @andrewxt 再试一次,我把引号/括号的位置弄错了。
  • 不幸的是,我在同一行遇到了错误。但是,这一次,我根本没有收到错误消息。根据错误断点,shirtNamepantsName 仍然显示为 nil
  • @andrewxt 尝试不要在 viewdidload() 部分创建图像 NSArrays。将图像分配给顶部数组可能会解决您的错误,或者使用不同类型的数组(尝试 NSMutableArray)。
  • 你的意思是从主视图控制器移动到页面内容视图控制器吗?我在 main 中尝试过,但仍然返回 nil 值。如果有帮助,我大部分时间都关注了this 视频。如果页面视图有所不同,则页面视图也在容器中。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多