XIB的内容未加载

时间:2015-08-06 19:22:00

标签: ios iphone swift uiviewcontroller xib

在我的应用程序中,我有一个自定义的UIViewController,它有一个相应的XIB文件。我在XIB文件中创建了几个按钮和标签,并为自定义UIViewcontroller创建了插座。然后我通过常用方法将此视图控制器推送到导航堆栈:

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.
    }
    */

}

3 个答案:

答案 0 :(得分:4)

问题是你没有从笔尖加载视图控制器,你只是用空的初始化器ChallengeDetails()初始化它。要使用您创建的nib文件创建视图控制器,请使用:

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

确保将Interface Builder中的nib类设置为“检查器”窗格中的ChallengeDetails

答案 1 :(得分:3)

这是我通常做的事情:

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

我还将所有XIB的@IBOutlets保留在我的XIB课程中。

答案 2 :(得分:0)

初始化ViewController时,应加载XIB文件。您可以在Swift 4.2

中执行以下操作
let detailsVC = ChallengeDetails(nibName :"DetailScreen", bundle : Bundle.main)

请注意,DetailScreen字符串上方是XIB文件的名称。