【问题标题】:Contents of XIB not loadingXIB 的内容未加载
【发布时间】:2015-10-30 02:17:51
【问题描述】:

在我的应用程序中,我有一个自定义 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.
    }
    */

}

【问题讨论】:

    标签: ios iphone swift uiviewcontroller xib


    【解决方案1】:

    问题是您没有从 nib 加载视图控制器,您只是使用空初始化程序 ChallengeDetails() 对其进行初始化。要使用您创建的 nib 文件创建视图控制器,请使用:

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

    确保在 Inspector 窗格中也将 Interface Builder 中 nib 的类设置为 ChallengeDetails

    【讨论】:

    • 这正是我想要的。对于未来的搜索者:在上述作业中指定您的 nib 名称时,不应该包含“.xib”是毫无价值的。
    • 谢谢。尽管曾经(在 objc 时代)并不强制使用 nibName 显式初始化 ViewController - iOS 会搜索具有相同名称的 xib。
    【解决方案2】:

    这是我通常做的:

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

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

    【讨论】:

      【解决方案3】:

      您应该在初始化 ViewController 时加载您的 XIB 文件。您可以在Swift 4.2 中执行以下操作@

      let detailsVC = ChallengeDetails(nibName :"DetailScreen", bundle : Bundle.main)
      

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

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 2020-05-16
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 2017-05-06
        • 2020-09-02
        相关资源
        最近更新 更多