Не могу понять, как подключить класс UIView к View в IB с помощью Swift

** Обновлено ** Я работаю над идеей в Swift и не могу понять, как подключить представление к классу представления.

У меня есть UIViewController в IB и класс UIViewController, связанный с этим UIViewController в IB. Внутри UIViewController и наркотиков в UIView в IB. Я хочу дать этому UIView собственный класс. У меня есть текстовое поле внутри представления, и я хотел бы, чтобы класс UIView обрабатывал весь код настройки для этого текстового поля. Мне удалось создать класс UIView, но я также смог установить его как класс bast для View в IB. Я не уверен на 100%, как инициировать этот класс, чтобы я мог создавать вары в классе UIView и управлять их перетаскиванием в мое текстовое поле в IB,

* Обновлено * Пока это мой код. Кажется, он хоть что-то делает, но я получаю сообщение об ошибке плода.

import UIKit

class AddPlayerView: UIView
    @IBOutlet weak var inputPlayerOne: UITextField!
    @IBOutlet weak var addPlayerOne: UIButton!

    override init(frame: CGRect) {
        super.init(frame: frame)
        // Initialization code

        println("init add player")

    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Это я распечатал

фатальная ошибка: init (coder :) не реализован:


person icekomo    schedule 30.08.2014    source источник
comment
Вы когда-нибудь думали об использовании Tap Gesture Recognizer для закрытия клавиатуры? С resignFirstResponder?   -  person chuckus    schedule 30.08.2014
comment
У вас никогда не было возможности просто перетащить что-то из пера / раскадровки в класс UIControl. Свифт здесь не имеет значения. Какую связь вы бы хотели установить? Нет ничего, что имело бы смысл, поэтому Xcode ничего не мог сделать. Далеко не очевидно, что вы ожидаете или пытаетесь сделать.   -  person matt    schedule 30.08.2014
comment
Привет, Мэтт, может, я неправильно объясняюсь. В IB я создал представление, а внутри него разместил текстовое поле. Думаю, создал класс UIControl. После этого в раскрывающемся списке настраиваемых классов я бы выбрал только что созданный класс UIControl. Итак, мой класс UIControl теперь связан с моим представлением в IB. Затем я бы создал IBOutlet и подключил его к чему-то внутри представления в IB. Я делал это, чтобы сохранить весь код ввода текста отдельно от кода viewController. Думаю, я не понимаю, как использовать класс UIControl самостоятельно.   -  person icekomo    schedule 30.08.2014


Ответы (3)


Я просто не понимаю твоего вопроса. Инициализация представления в IB запустит init (кодировщик aDecoder: NSCoder), а не init (frame: CGRect), и это стандартно. Теперь, если вас беспокоит доступ к некоторым переменным, которые не инициализированы, просто переопределите функцию awakeFromNib (). И реализуйте требуемый инициализатор только с супер

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override awakeFromNib(){
    // Initialization code
}

Имеет ли это смысл?

person DennyLou    schedule 10.12.2014

Вы можете создать розетку, выполнив следующие действия (протестировано с Xcode6-Beta6 + Swift):

  1. В Xcode активируйте помощник редактора (у вас должна быть раскадровка в левой части экрана, а код Swift - в правой).
  2. Слева выберите View (теперь справа у вас должен быть Swift Controller, связанный с этим представлением)
  3. Слева щелкните правой кнопкой мыши элемент пользовательского интерфейса (например, UIButton в вашем представлении)
  4. Над элементом пользовательского интерфейса появится темная прозрачная панель.
  5. Щелкните левой кнопкой мыши кнопку "кружок / плюс" рядом с элементом New Referencing Outlet.
  6. Удерживая нажатой левую кнопку мыши, перетащите линию в Swift Controller (например, где вы должны объявить свойство экземпляра).
  7. Отпустите левый щелчок
  8. Xcode попросит вас дать имя Outlet, введите что-то вроде «button»
  9. Нажмите Подключиться

Выполнено. Теперь в вашем быстром классе у вас есть ссылка на ваш UIButton.

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    ...

Надеюсь это поможет.

person Luca Angeletti    schedule 30.08.2014
comment
Спасибо, Appz ... Я обновил свой вопрос, так как не думаю, что правильно объяснял свою проблему. - person icekomo; 30.08.2014

Storyboard использует собственный инициализатор: init(coder:) для инициализации своих xib. Это также означает, что если вы переопределяете один инициализатор, вы должны также переопределить required инициализатор раскадровки (упомянутый ранее coder). Похоже, что вы это сделали, но по какой-то причине вы поместили fatalError("init(coder:) has not been implemented") as your code в required init(coder aDecoder: NSCoder).
Это означает, что каждый раз, когда инициализируются ваши представления, вызывается этот метод, и, конечно же, он вызовет фатальную ошибку и приведет к сбою вашего приложения.
Мы должны заменить этот код. Обязательно вызовите super.init(coder: aDecoder) в начале метода, а затем разместите остальную часть кода инициализатора.
Вы также можете найти этот ответ о переполнении стека полезным: Fatal ошибка: использование нереализованного инициализатора init (coder :) для класса
Пожалуйста, дайте мне знать, если у вас возникнут другие проблемы. Удачи!

person dcgoss    schedule 17.10.2014