【问题标题】:IOS - unexpectedly found nil while unwrapping an Optional valueIOS - 在展开可选值时意外发现 nil
【发布时间】:2016-03-12 00:10:58
【问题描述】:

您好,我正在 IOS 上实现一个教程屏幕,所以我使用的是 PageViewController。我正在关注本教程

https://www.youtube.com/watch?v=OnC8XVdHsVM

教程代码可以在这里找到

https://github.com/simplyi/UIPageVIewControllerExample

当我运行应用程序时出现此错误

“在展开可选值时意外发现 nil”

程序在这一行停止

TutorialScreenViewController.swift

var imageFileName: String!
 override func viewDidLoad() {
    super.viewDidLoad()


  myImageView.image = UIImage(named:imageFileName)
   }

在另一个控制器名称 ViewController.swift 我正在这样做

    override func viewDidLoad() {
            super.viewDidLoad()

            pageImages = NSArray(objects: "startscreen","startscreen2","startscreen3")


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

            self.pageViewController.dataSource = self

            let initialContenViewController = self.pageTutorialAtIndex(0) as TutorialScreenViewController

            let viewControllers = NSArray(object: initialContenViewController)

            self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
           /* self.pageViewController.setViewControllers(viewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)*/

            self.pageViewController.view.frame = CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.size.height-100)

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

        }
  func pageTutorialAtIndex(index: Int) -> TutorialScreenViewController
    {

        let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("TutorialScreenViewController") as! TutorialScreenViewController

        pageContentViewController.imageFileName = pageImages[index] as! String
        pageContentViewController.pageIndex = index


        return pageContentViewController

    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?
    {

        let viewController = viewController as! TutorialScreenViewController
        var index = viewController.pageIndex as Int

        if(index == 0 || index == NSNotFound)
        {
            return nil
        }

        index--

        return self.pageTutorialAtIndex(index)

    }

     func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?

     {
        let viewController = viewController as! TutorialScreenViewController
        var index = viewController.pageIndex as Int

        if((index == NSNotFound))
        {
            return nil
        }

        index++

        if(index == pageImages.count)
        {
            return nil
        }

        return self.pageTutorialAtIndex(index)
    }



    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int

    {

    return pageImages.count
    }

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int // The selected item reflected in the page indicator.

    {
    return 0

    }

任何人都知道这条线有什么问题。

【问题讨论】:

  • 您是否在资产文档中添加了名为 ImageFileName 的图像?
  • 请参阅我已更新问题。 @kholl
  • 将 imagename(value) 赋值给 imageFileName 变量。
  • 对不起,我不明白。您能否编辑需要修改的代码。对不起,我是IOS的新手

标签: ios uiimageview uistoryboard uipageviewcontroller


【解决方案1】:

在 viewDidLoad 你必须设置 var imageFileName: String!使用前

create a var like the (var name : type!) 意味着您创建了一个可选类型 type 并将其设置为 nil 但可以访问它而无需打开它,因为 !并不是 ? ,你从来没有设置 imageFileName !

你需要做的是在使用前在 viewDidLoad 中设置 imageFileName :

 override func viewDidLoad() {
super.viewDidLoad()
if imageFileName == nil {
imageFileName = "startscreen"
}
myImageView.image = UIImage(named:imageFileName)
}

【讨论】:

  • 在 github 项目中,资产不是命名为 startscreen 而是“screen1.jpg”
  • 但是有三张图片?
  • 好的,所以你必须创建三个不同名称的 UIImage :-) 。并更改它我不知道您是否清楚,但现在您使用“startscreen”资产名称创建图像并将其分配给 myImageView.Image ,如果要分配另一个图像,则必须创建另一个 UIImage
  • 好吧其实我正在实现一个教程屏幕......所以三个图像将来自另一个控制器。你可以在上面看到......如果我尝试你的代码,那么应用程序会成功运行并且只加载一个图像并且不实现教程屏幕功能。似乎它不会像那样转到另一个控制器
  • 我再次更新了我的问题,以便您更好地理解
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2016-10-18
  • 2017-04-09
  • 2018-09-22
相关资源
最近更新 更多