Ios 尝试在另一个类中实际调用导航栏函数
我创建了一个导航栏,我正试图在另一个视图控制器中调用它。我通过调用我分为左、中、右按钮的方法来设置它。在另一个控制器中,我调用navbarcontroller并尝试调用为其设置导航工具栏的方法。什么也没发生,但是没有撞车Ios 尝试在另一个类中实际调用导航栏函数,ios,swift,xcode,Ios,Swift,Xcode,我创建了一个导航栏,我正试图在另一个视图控制器中调用它。我通过调用我分为左、中、右按钮的方法来设置它。在另一个控制器中,我调用navbarcontroller并尝试调用为其设置导航工具栏的方法。什么也没发生,但是没有撞车 import UIKit class NavBarController : UIViewController{ var screenSize: CGRect! override func viewDidLoad() { super.viewDidLoad()
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有一个很小的了解,但它开始缓慢地点击。当我在上面运行上述代码时