2015-08-06 2 views
2

В моем приложении у меня есть пользовательский UIViewController с соответствующим XIB-файлом. Я создал пару кнопок и меток в XIB-файле и создал выходы в пользовательский UIViewcontroller. Я затем нажмите этот вид контроллер на навигационном стек с помощью обычных средств:Содержание XIB не загружается

let challengeDetails = ChallengeDetails() 
self.navigationController!.pushViewController(challengeDetails, animated: true) 

Я знаю, что контроллер представления выталкивается в стек, потому что я установить фоновый цвет его точку зрения на красный и то, что я получаю пустой красный вид. Я не понимаю, почему я не вижу ярлыков и кнопок, которые я создал в XIB-файле.

Я проверил обычное количество вещей: Владелец файла установлен в мой пользовательский класс. представление xib связано с контроллером представления (в Outlets).

Когда я создал проект, я выбрал «Приложение с вкладками», и оно появилось вместе с доской. Однако, когда я создал файл XIB, я сделал это, просто установив флажок при создании нового подкласса контроллера. Нужно ли подключать XIB к доске объявлений, чтобы она работала?

Любая помощь будет оценена по достоинству. Если это помогает, вот пользовательский класс:

import UIKit 

class ChallengeDetails: UIViewController { 

    // Outlets from xib file. 
    @IBOutlet weak var challengeDescriptionTextView: UITextView! 
    @IBOutlet weak var challengeTitleLabel: UILabel! 
    @IBAction func browseTitlesButton(sender: UIButton) { 
     browseTitlesInChallenge() 
    } 
    @IBAction func acceptChallengeButton(sender: UIButton) { 
     acceptThisChallenge() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = UIColor.redColor() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func browseTitlesInChallenge() { 

    } 

    func acceptThisChallenge() { 

    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 

ответ

4

Проблема в том, что вы не загружаете контроллер вида из наконечника, вы просто инициализируете его пустым инициализатором ChallengeDetails(). Для того, чтобы создать контроллер представления, используя файл острия, который вы создали, используйте:

let challengeDetails = ChallengeDetails(nibName: "YourNibNameHere", bundle: NSBundle.mainBundle()) 

Убедитесь, что вы установили класс вашего пера в Interface Builder для ChallengeDetails в панели инспектора тоже.

+0

Это то, что я искал точно. Для будущих поисковиков: ничего не стоит, что вы не должны включать «.xib» при указании имени ниба в приведенном выше присваивании. – zeeple

+1

Спасибо. Хотя он однажды (в objc-эре) не был обязательным для инициализации ViewController явно с помощью nibName - iOS будет искать xib с тем же именем. – dOM

3

Вот что я обычно делаю:

let yourXIB = NSBundle.mainBundle().loadNibNamed(
      "yourXIBName", 
      owner: nil, 
      options: nil)[0] as! yourXIBClass 
view.addSubview(yourXIB) 

Я также держать все @IBOutlets моего XIb внутри класса моего XIb в.

Смежные вопросы