2015-09-23 4 views
1

Я пытаюсь загрузить xib filed, называемый «AddProgramView», используя loadnibnamed, когда пользователь нажимает кнопку. Я создал xib в раскадровке, поместил различные subviews в xib-представление и подключил выходы к соответствующему быстрому файлу с именем AddProgramView. Когда я загружаю xib, ни одно из подзонов не появляется. Они все пропали без вести. Помогите? Вот мой кодloadnibnamed не загружает subviews

В моей основной контроллер зрения:

@IBAction func addProgram(sender: UIButton) { 

    if let _ = addProgramView { 
     addProgramView!.frame = CGRectMake(0, self.window!.frame.origin.y + self.window!.frame.height, self.window!.frame.width, CGFloat(325)) 
    } 
    else { 
     let addProgramViews = NSBundle.mainBundle().loadNibNamed("AddProgramView", owner: self, options: nil) 
     addProgramView = addProgramViews.first as? AddProgramView 

     addProgramView!.frame = CGRectMake(0, self.window!.frame.origin.y + self.window!.frame.height, self.window!.frame.width, CGFloat(325)) 

     window?.addSubview(addProgramView!) 
    } 

    window?.bringSubviewToFront(addProgramView!) 

    UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 
     self.addProgramView!.frame.origin.y -= CGFloat(325) 
     }, completion: nil) 
} 

Файл AddProgramView.swift:

class AddProgramView: UIView { 


    @IBOutlet weak var nameField: UITextField! 
    @IBOutlet weak var cancelButton: UIButton! 

    @IBOutlet weak var instructionsLabel: UILabel! 
} 
+0

Не могли бы вы включить какой-то код о объявленном вами «окне»? –

+0

Это просто окно делегата приложения. Пользовательское представление появляется в этом окне, но не имеет подзаголовков –

ответ

2

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

class name

Если нет, сделайте это. Затем повторите попытку.

Другой вариант является создание IBOutlet в вашем AddProgramView.swift

@IBOutlet var contentView: UIView! 

и удалить имя класса с точки зрения и добавить его в файл владелицей.

owner's class name

Connect contentView правой кнопкой мыши на владельца файла:

enter image description here

Затем создать методы инициализации, как это:

class AddProgramView: UIView { 
    @IBOutlet var contentView: UIView! 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     commonInit() 
    } 

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

    func commonInit() { 
     NSBundle.mainBundle().loadNibNamed("AddProgramView", owner: self, options: nil) 
     self.addSubview(self.contentView) 
     self.contentView.frame = self.bounds 
    } 
} 

И теперь вы можете использовать AddProgramView где угодно. Либо инициализации (кадр :)

let addProgramView = AddProgramView.init(frame: CGRectMake(0, 0, 320, 30)) 

или вы можете использовать их непосредственно в раскадровке, добавив UIView и установить их класс AddProgramView (нет дополнительной строки кода, раскадровка будет вызывать Init (кодировщик :) для вас)

storyboard

Я создал пример проекта для вас - CustomView project

+0

Я уже пробовал первый вариант правильно. Поэтому я попробовал второй вариант. Я должен добавить каждый IBOutlet в commonInit() или просто contenView, в котором есть все мои подзаголовки? В частности, допустим, у меня есть IBOutlet, называемый myTextField, который является подвью в contentView. Должен ли я добавить myTextField в качестве подзадача contentView в commonInit()? Я предполагаю, что нет, но это не работает. Есть два вопроса: –

+0

Я уже пробовал первый вариант правильно. Поэтому я попробовал второй вариант.Я должен добавить каждый IBOutlet в commonInit() или просто contenView, в котором есть все мои подзаголовки? Я предполагаю, что нет, но это не работает. Существует два вопроса: (1) размещение содержимогоView смещено влево от того места, где оно должно быть. Вызов self.contentView.bounds = self.bounds не работает правильно (2) subviews все еще не отображаются, просто добавив contentView в качестве подсмотра в commonInit(). Если я добавлю свои subviews явно, они потеряют все ограничения, указанные в файле xib. Есть идеи? –

+0

Я обновил ответ для вас. Вы должны использовать рамку вместо границ. Существует также пример проекта, посмотрите. –

1

Дважды проверьте, что вы не имеете класс размер, указанный в вашем XIb фил е. Он должен указать Any/Any в нижней части окна редактора.

+0

Зачем это важно? –