Arhn - архитектура программирования

Имя UIImage из массива продолжает возвращать нулевое значение.

Настройка просмотра страницы внутри контейнера. Выполнил все инструкции, которые смог найти (новичок).

Эти два массива находятся в контроллере основного представления, в котором есть имена изображений, которые я хочу заполнить на страницах.

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 value или CUICatalog: Invalid asset name supplied:, что означает, что каким-то образом они получают нулевое значение из массивов.

Класс содержимого страницы выглядит следующим образом:

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 Я не уверен, что понимаю. Как я должен был это сделать? 12.04.2016
  • @andrewxt Я думаю, у вас либо есть проблема, когда вы устанавливаете изображение в UIImageView (т. Е. Синтаксис для установки изображения неверен), либо у вас есть проблема с именованием вашего изображения (возможно, у вас не все изображения названы правильно) . Я ответил на это ниже, просто следуйте тому, что я сказал делать! Это должно помочь, дайте мне знать, если это не так. 12.04.2016
  • @Paulw11 Paulw11 Вы имеете в виду, что это должно быть в контроллере основного представления или в контроллере представления содержимого страницы? 12.04.2016
  • Я думаю, вы могли бы сделать этот массив некачественным способом. Это моя следующая идея :). Проверьте мое исправленное решение ниже. По сути, вы удаляете все свои вещи NSArray и создаете два новых NSMutableArray вне viewdidload(). 12.04.2016

Ответы:


1

Я думаю, что нашел вашу проблему, ваш код входит в это выражение if?

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

Если это так, shirtName и pantsName никогда не будут инициализированы.

11.04.2016
  • Я думал, что дал им значения в методе viewControllerAtIndex главного контроллера представления. Нужно ли мне давать им значения в другом месте? 12.04.2016
  • Вы правы, но я думаю, что нашел проблему сейчас, я отредактировал свой ответ. 12.04.2016
  • Я попытался прокомментировать этот оператор if, чтобы увидеть, вернет ли он вместо этого vc, но получил ту же ошибку. Я не уверен, что это имеет значение, но просмотр страницы находится в контейнере. Если это что-то значит, основная часть этого кода взята из этого видео. 12.04.2016

  • 2

    Что-то идет не так, когда вы меняете изображение UIImageView. Попробуйте todayShirt.image = UIImage(imageLiteral: "\(shirtName)") и todayPants.image = UIImage(imageLiteral: "\(pantsName)").

    Затем убедитесь, что в проект XCode вставлено 4 изображения: shirt1.png, shirt2.png, pants1.png и pants2.png. Также нормально, если они shirt1.jpg и т.д.

    Если это все еще не помогает, попробуйте изменить метод создания массива. Вместо того, чтобы использовать NSArray и добавлять к нему объекты только в разделе viewdidload(), просто создайте массивы и добавьте объекты в глобальную область. Итак, прямо сейчас, где у вас есть var shirtImage: NSArray и var shirtImage: NSArray, удалите их оба и добавьте var shirtsArray:NSMutableArray = ["shirt1", "shirt2"] и var pantsArray:NSMutableArray = ["pants1", "pants2"].

    11.04.2016
  • Спасибо за ответ. У меня есть правильные активы в проекте. Кроме того, когда я пробую строку imageLiteral, Xcode настаивает на добавлении бесконечных запятых в ее конец. Не уверен, что это ошибка IDE или другая проблема. 12.04.2016
  • @andrewxt попробуйте еще раз, я ошибся с размещением кавычек/круглых скобок. 12.04.2016
  • К сожалению, я получил ошибку в той же строке. Однако на этот раз я вообще не получил сообщения об ошибке. Согласно контрольной точке ошибки, shirtName и pantsName по-прежнему кажутся нулевыми. 12.04.2016
  • @andrewxt попробуйте не создавать свои изображения NSArrays в разделе viewdidload(). Это может исправить вашу ошибку, чтобы назначить изображения массиву вверху или использовать другой тип массива (попробуйте NSMutableArray). 12.04.2016
  • Вы имеете в виду, что это должно перейти от контроллера основного представления к контроллеру представления содержимого страницы? Я попробовал это в основном и все равно вернул нулевое значение. Если это поможет, я следил за этим видео для большей части этого. Просмотр страницы также находится в контейнере, если это имеет значение. 12.04.2016
  • @andrewxt Нет, я имею в виду заменить ваши NSArrays на NSMutableArrays и добавить содержимое в массивы за пределами представления, которое было загружено (в глобальной области видимости, поэтому они инициализируются значениями), возможно, предотвращая риск вашей ошибки. 12.04.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..