【问题标题】:Programmatically create a navigation view以编程方式创建导航视图
【发布时间】:2017-05-01 13:10:24
【问题描述】:

所以我正在尝试创建一个应用程序,但我正在尝试避免使用情节提要。因此,只需使用 swift 文件和 XIB 文件即可。

我之前使用过导航控制器,但我猜还不够。到目前为止,我有这个:

在 AppDelegate 我有:

let homeVC = HomeViewController()
let rootVC = UINavigationController(rootViewController: homeVC)

window!.rootViewController = rootVC
window!.makeKeyAndVisible()

我的视图目前完全是空的,但带有创建新 XIB 文件时附带的基本“视图”屏幕。我已经将它的大小设置为freeform,而其他所有东西,如顶部栏、状态栏都是Inferred

在我的 HomeViewController.swift 中有:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    let nib = UINib(nibName: "HomeView", bundle: nil)
    let objects = nib.instantiateWithOwner(self, options: nil)
    self.view = objects[0] as! UIView;

    print(self.navigationController)

    // customize navigation bar
    let settingsImage = UIImage(named: "settingsWheelBlack.png")
    let settingsNavItem = UIBarButtonItem(image: settingsImage, style: UIBarButtonItemStyle.Plain, target: nil, action: Selector("selector"))
    let addStuffItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: nil, action: Selector("selector"))

    self.navigationController?.navigationItem.title = "Home"
    self.navigationController?.navigationItem.leftBarButtonItem = settingsNavItem
    self.navigationController?.navigationItem.rightBarButtonItem = addStuffItem

    print(self.navigationController?.navigationBar)
    print(self.navigationController?.navigationItem.title)
}

但是当我运行应用程序时,导航栏没有出现。除了我目前拥有的之外,这是我尝试过的:

  1. 将导航栏控件添加到我的 XIB 并将 IB 插座连接到它。还将 IB 插座连接到导航栏控件中已存在的导航项。然后设置标题,并在其中设置左右按钮。没用

    1. 立即在 AppDelegate 中为上面定义的 rootVC 设置标题和按钮。没用。

任何想法我错过了什么?

【问题讨论】:

    标签: swift uiviewcontroller uinavigationcontroller storyboard uinavigationbar


    【解决方案1】:

    在阅读大量 Apple 文档后,我获得了一些力量解决了这个问题。在这个页面上,我发现了一小段文字:

    In a navigation interface, each content view controller in the navigation stack provides a navigation item as the value of its **navigationItem** property. The navigation stack and the navigation item stack are always parallel: for each content view controller on the navigation stack, its navigation item is in the same position in the navigation item stack.

    所以我保留了我的 AppDelegate 代码并将我的 viewDidLoad 函数更改为:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Do any additional setup after loading the view.
        let nib = UINib(nibName: "EventsHomeView", bundle: nil)
        let objects = nib.instantiateWithOwner(self, options: nil)
        self.view = objects[0] as! UIView;
    
        print(self.navigationController)
    
        // customize navigation bar
        let settingsImage = UIImage(named: "settingsWheelBlack.png")
        let settingsNavItem = UIBarButtonItem(image: settingsImage, style: UIBarButtonItemStyle.Plain, target: nil, action: Selector("selector"))
        let addStuffItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: nil, action: Selector("selector"))
    
        // Each VC within a navigation controller has it's own navigationItem property that the underlying navigation controller uses to show in the navigationBar
        self.navigationItem.title = "Home"
        self.navigationItem.leftBarButtonItem = settingsNavItem
        self.navigationItem.rightBarButtonItem = addStuffItem
    }
    

    还有中提琴!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多