Ios 尝试在另一个类中实际调用导航栏函数

Ios 尝试在另一个类中实际调用导航栏函数,ios,swift,xcode,Ios,Swift,Xcode,我创建了一个导航栏,我正试图在另一个视图控制器中调用它。我通过调用我分为左、中、右按钮的方法来设置它。在另一个控制器中,我调用navbarcontroller并尝试调用为其设置导航工具栏的方法。什么也没发生,但是没有撞车 import UIKit class NavBarController : UIViewController{ var screenSize: CGRect! override func viewDidLoad() { super.viewDidLoad()

我创建了一个导航栏,我正试图在另一个视图控制器中调用它。我通过调用我分为左、中、右按钮的方法来设置它。在另一个控制器中,我调用navbarcontroller并尝试调用为其设置导航工具栏的方法。什么也没发生,但是没有撞车

import UIKit

class NavBarController : UIViewController{

var screenSize: CGRect!

override func viewDidLoad() {
    super.viewDidLoad()

    setupNavigationBarItems()
    setupToolBarItems()

    self.navigationController?.isToolbarHidden = false
    self.view!.backgroundColor = .white

}
我对导航栏的方法是

func setupNavigationBarItems() {
    setupCenterNavButton()
    setupLeftNavButton()
    setupRightNavButton()
}
func showCalendarController() {
    let navController = CalendarController()
    self.present(navController, animated: true, completion: nil)
} //connect bottom bar buttons to controller
func showEventsController() {
    let navController = EventsController()
    self.present(navController, animated: true, completion: nil)
} //connect bottom bar buttons to controller

func setupNavigationBarItems() {
    setupCenterNavButton()
    setupLeftNavButton()
    setupRightNavButton()
} // top bar button setup

private func setupCenterNavButton() {
    let buttonFrame = UIView(frame: CGRect(x: 0, y: 0, width: 165, 
height: 20))
    mainFeedButton.frame = CGRect(x: 0,y: 0, width: 80,height: 20) as 
CGRect
    mainFeedButton.backgroundColor = UIColor.blue
    peekFeedButton.frame = CGRect(x: 85,y: 0, width: 80,height: 20) as 
CGRect
    peekFeedButton.backgroundColor = UIColor.blue
    buttonFrame.addSubview(mainFeedButton)
    buttonFrame.addSubview(peekFeedButton)
    navigationItem.titleView = buttonFrame
} //center bar buttons / action setup

private func setupLeftNavButton() {
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: 
favoriteButton)
}// left bar buttons / action setup

private func setupRightNavButton() {
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: 
moreButton)
} //right bar buttons / action setup

lazy var mainFeedButton: UIButton! = {
    let button = UIButton(type: .custom) // button type
    button.setTitle("Main",for: .normal) //button title
    button.sizeToFit()  // size button to fit the title
    var frame = button.frame //create frame to manipulate the body
    button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
    button.addTarget(self, action: 
#selector(self.showMainFeedController),
                     for: .touchUpInside)
    return button
}() //mainFeed button connected to Feed Controller

lazy var peekFeedButton: UIButton! = {
    let button = UIButton(type: .custom) //button type
    button.setTitle("Spy",for: .normal) //button title
    button.sizeToFit()  // size button to fit the title
    var frame = button.frame //create frame to manipulate the body
    button.frame = CGRect(x: 20, y: 0, width: 100, height: 40)
    button.addTarget(self, action: 
#selector(self.showSpyFeedController),
                     for: .touchUpInside)
    return button
}()//peekFeed button frame and action setup 

lazy var favoriteButton: UIButton! = {
    let button = UIButton(type: .system) //default button with blue 
text
    button.setImage(#imageLiteral(resourceName: 
"star").withRenderingMode(.alwaysOriginal), for: .normal)
    button.contentMode = .scaleAspectFit
    button.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
    button.addTarget(self, action: #selector(favoriteButton_tapped),
                     for: .touchUpInside)
    return button
}() //favorites button frame and action setup

lazy var moreButton: UIButton! = {
    let button = UIButton(type: .system) //default button with blue 
text
    button.setImage(#imageLiteral(resourceName: 
"more").withRenderingMode(.alwaysOriginal), for: .normal)
    button.contentMode = .scaleAspectFit
    button.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
    button.addTarget(self, action: #selector(moreButton_tapped),
                     for: .touchUpInside)
    return button
}() //more button frame and action setup

func showMainFeedController() {
    let navController = MainFeedController()
    self.present(navController, animated: true, completion: nil)
} //mainFeed button connected to Feed Controller
func showSpyFeedController() {
    let navController = SpyFeedController()
    self.present(navController, animated: true, completion: nil)
}//peekFeed button connected to SpyFeedController
func favoriteButton_tapped(sender: UIButton) {
    print("You touched this!")
}
func moreButton_tapped(sender: UIButton) {
    print("You touched this!")
}
}
然后我尝试通过setupNavigationBarItems()调用该函数,如下所示

import UIKit

class EventsController: UIViewController{

    override func viewDidLoad() {
        super.viewDidLoad()

        let navbar = NavBarController()
        navbar.setupNavigationBarItems()
        self.navigationController?.isToolbarHidden = false
        self.view.backgroundColor = .white

     }
}

我不确定这是否有效。我对这一切还是有点陌生。

不清楚你预期会发生什么,但下面是实际发生的情况:

    let navbar = NavBarController()
将创建一个全新的NavBarController对象

    navbar.setupNavigationBarItems()
将调用该NavBarController对象的
设置NavigationBarItems

    self.navigationController?.isToolbarHidden = false
    self.view.backgroundColor = .white

你的代码结束了
navbar
是一个局部变量,因此NavBarController对象在一股烟雾中消失。结束。此对象的创建和配置没有任何目的。

不清楚您预期会发生什么,但下面是实际发生的情况:

    let navbar = NavBarController()
将创建一个全新的NavBarController对象

    navbar.setupNavigationBarItems()
将调用该NavBarController对象的
设置NavigationBarItems

    self.navigationController?.isToolbarHidden = false
    self.view.backgroundColor = .white

你的代码结束了
navbar
是一个局部变量,因此NavBarController对象在一股烟雾中消失。结束。这个对象被创建并配置为没有任何用途。

我记得我在iOS上的第一个月是2015:D,没有任何OOP方面的知识,我也不知道如何将数据传递到另一个屏幕或类

无论如何,您不会在
EventsController
中创建
NavBarController
类的新实例。如果要从
事件控制器
导航栏控制器
通话,则需要当前处于活动状态的引用。您还可以使用
委托
(稍后搜索)

因此,在从
NavBarController
显示或呈现
EventsController
之前,请将当前的
NavBarController
实例传递到下一个屏幕,即
EventsController
。但首先,您需要在
事件控制器中声明一个变量,对吗?:)

  • EventsController
    类中声明一个类型为
    NavBarController
    的变量,如下所示:

    var navBarController: NavBarController!
    
    self.navBarController.navbar.setupNavigationBarItems()
    
  • 然后在您的这段代码中,在显示或演示之前,将您自己(NavBarController
  • 实例)传递给
    EventsController
    类,请注意,您错误地为
    EventsController
    新实例指定了一个错误的名称,因此我将其重命名为:

    func showEventsController() {
        let eventsController = EventsController()
        eventsController.navBarController = self // THIS :)
        self.present(eventsController, animated: true, completion: nil)
    }
    
  • 最后,与此相反:

    let navbar = NavBarController()
    navbar.setupNavigationBarItems()
    
  • 使用声明的变量,如下所示:

    var navBarController: NavBarController!
    
    self.navBarController.navbar.setupNavigationBarItems()
    

    希望这有帮助!:)

    我记得我在iOS上的第一个月是在2015:D,我没有任何OOP方面的知识,我也不知道如何将数据传递到另一个屏幕或类

    无论如何,您不会在
    EventsController
    中创建
    NavBarController
    类的新实例。如果要从
    事件控制器
    导航栏控制器
    通话,则需要当前处于活动状态的引用。您还可以使用
    委托
    (稍后搜索)

    因此,在从
    NavBarController
    显示或呈现
    EventsController
    之前,请将当前的
    NavBarController
    实例传递到下一个屏幕,即
    EventsController
    。但首先,您需要在
    事件控制器中声明一个变量,对吗?:)

  • EventsController
    类中声明一个类型为
    NavBarController
    的变量,如下所示:

    var navBarController: NavBarController!
    
    self.navBarController.navbar.setupNavigationBarItems()
    
  • 然后在您的这段代码中,在显示或演示之前,将您自己(NavBarController
  • 实例)传递给
    EventsController
    类,请注意,您错误地为
    EventsController
    新实例指定了一个错误的名称,因此我将其重命名为:

    func showEventsController() {
        let eventsController = EventsController()
        eventsController.navBarController = self // THIS :)
        self.present(eventsController, animated: true, completion: nil)
    }
    
  • 最后,与此相反:

    let navbar = NavBarController()
    navbar.setupNavigationBarItems()
    
  • 使用声明的变量,如下所示:

    var navBarController: NavBarController!
    
    self.navBarController.navbar.setupNavigationBarItems()
    

    希望这有帮助!:)

    这是有道理的,那么有没有办法调用setupNavigationBarItems()方法,或者我只是在创建一个新的方法?您没有提供足够的信息让我回答这个问题。显然,如果你想和屏幕上已经出现的人交谈,你不想创建一个新的。您想引用已经在屏幕上的一个。如何引用一个?除了用相同的按钮创建一个完整的导航栏之外,我一直在尝试各种方法。我说,你没有提供足够的信息。它取决于您所在的视图控制器和要与之对话的视图控制器之间的层次视图控制器关系。但是,我已经回答了您提出的问题,即为什么您的代码似乎没有效果。这是因为它没有效果!这是有道理的,那么有没有办法调用setupNavigationBarItems()方法,或者我只是在创建一个新的方法?您没有提供足够的信息让我回答这个问题。显然,如果你想和屏幕上已经出现的人交谈,你不想创建一个新的。您想引用已经在屏幕上的一个。如何引用一个?除了用相同的按钮创建一个完整的导航栏之外,我一直在尝试各种方法。我说,你没有提供足够的信息。它取决于您所在的视图控制器和要与之对话的视图控制器之间的层次视图控制器关系。但是,我已经回答了您提出的问题,即为什么您的代码似乎没有效果。这是因为它没有效果!那真的很有帮助!我对oop有一个很小的了解,但它开始缓慢地点击。当我在上面运行上述代码时