Хобрук: Ваш путь к мастерству в программировании

Попытка загрузить перо программно получает множество ошибок, которых не было в Xcode 6

Я поднял старый проект, пытаясь повторно использовать некоторые функции. Я создал перо с подклассом UIView. В оригинальной рабочей версии мне не нужно было устанавливать File's owner в IB. Однако я получаю сообщения об ошибках, намекающих на то, что теперь мне нужно это сделать (Xcode 7): loaded the "TipView" nib but the view outlet was not set.

Итак, я приступил к подключению File's owner к контроллеру представления, который отвечает за настройку представления. Вот соответствующий код из контроллера представления:

class TipViewController: UIViewController {

  private let kTipViewHeight: CGFloat = 400
  private let kTipViewWidth: CGFloat = 300

  override func viewDidLoad() {
    super.viewDidLoad()

    if let tipView = createTipView() {
        let center = CGPoint(x: CGRectGetWidth(view.bounds)/2, y: CGRectGetHeight(view.bounds)/2)
        tipView.center = center
        view.addSubview(tipView)
    }
  }

  func createTipView() -> UIView? {
    if let view = UINib(nibName: "TipView", bundle: nil).instantiateWithOwner(nil, options: nil).first as? TipView {
        view.frame = CGRect(x: 0, y: 0, width: kTipViewWidth, height: kTipViewHeight)
        return view
    }
    return nil
  }

}

extension UIViewController {
  func presentTips(tips: [Tip], animated: Bool, completion: (() -> Void)?) {
    let controller = TipViewController()
    controller.modalTransitionStyle = .CrossDissolve
    presentViewController(controller, animated: animated, completion: completion)
  }
}

Я попытался установить instantiateWithOwner на: .instantiateWithOwner(self, options: nil).first (изменил nil на self) также безрезультатно.

Это соответствующий код контроллера представления представления:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    presentTips([], animated: true, completion: nil)
}

Подкласс UIView не делает ничего необычного, поэтому я не стал включать его код.

Когда я вношу запрошенные изменения - добавляю TipViewController в качестве владельца файла пера и подключаю его выход view к представлению пера - я получаю ряд сообщений об ошибках в зависимости от того, какие конфигурации я беру, начиная от:

this class is not key value coding-compliant for the key view. Can't add self as subview

Не уверен, почему я смог использовать перо без владельца файла в Xcode 6, но я не могу сделать это с Xcode 7 - не нашел никаких материалов или заметок о выпуске, связанных с изменением, поэтому я немного запутался пока.

Любая помощь очень ценится.

19.03.2016

Ответы:


1

Итак, я привязал владельца файла к контроллеру представления, который отвечает за настройку представления.

Нет, ты был прав в первый раз. Ваша проблема в том, что была ошибка, связанная с именами nib в iOS 8, она была исправлена ​​в iOS 9, и вы попали в сеть, потому что ошибка, по иронии судьбы, защищала вас от спотыкания об этой проблеме ранее.

Сделай это:

  • Оставьте владельца файла настроенным как NSObject.

  • Не подключайте никаких выходов от владельца файла к представлению в наконечнике; если есть такая розетка, удалите ее.

  • Загрузите перо с владельцем nil, как вы это делаете.

  • (Готовы к этому? Это ключ :) Переименуйте перо. Не называйте его TipView.xib. Именно это имя вызвало всю проблему, которую вы пытались обойти. Назовите его, скажем, TipViewNib.xib. Внесите соответствующие изменения в свой код, например, загрузите перо с помощью nibName: "TipViewNib".

  • Очистите все кеши, включая версию симулятора (как я объясняю здесь: Как очистить кэши и очистить все цели Xcode 4), чтобы избавиться от плохого пера (того, что с именем TipView.xib).

Тогда ваши проблемы испарятся, как утренний туман.

19.03.2016
  • Спасибо за вклад @matt. Это на самом деле не решило это для меня. Но я уверен, что это решит это для других. 20.03.2016
  • Я уверен, что я говорю правильно. Обратите внимание, что вам может потребоваться очистить все кеши, прежде чем это сработает, чтобы избавиться от плохого пера (тот, что с именем TipView). См. stackoverflow.com/questions/5714372/ Если это не сработает, можете ли вы опубликовать хотя бы соответствующую часть проекта на github? Я исправлю это для вас. 20.03.2016
  • Добавлена ​​очистка кешей в качестве шага. Это очень важно. Вы действительно все испортили, используя это имя пера, и потребуется некоторая работа, чтобы его выкрутить. 20.03.2016
  • Стрелять. Мне жаль. Вы были правы на 100%. Я очистил производные данные, и простое изменение имени пера позволило скомпилировать его без ошибок. Какая сумасшедшая ошибка! У вас есть открытый радар для этого, который я могу обмануть? 20.03.2016
  • Теперь это не ошибка. Это была ошибка в iOS 8. Эта ошибка закрыта — она была исправлена ​​в iOS 9. 20.03.2016
  • То, что вы видите в версии 9.3, не является ошибкой. Проблема заключается в вашей ошибке: вы не должны давать nib то же имя, что и контроллеру представления, если только вы не знаете особое значение, которое оно имеет (и вы хотите это особое значение). Ошибка в том, что вам когда-либо сошло с рук ваше неправильное поведение (в iOS 8). 20.03.2016
  • Новые материалы

    HMTL - Многозадачное обучение для решения задач НЛП
    Достижение результатов SOTA путем передачи знаний между задачами Область обработки естественного языка включает в себя десятки задач, среди которых машинный перевод, распознавание именованных..

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..