在我的场景代理中,我正在创建一个导航控制器,并试图将右栏按钮项添加到所有视图控制器中。这是我在场景代理中的代码
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: scene)
let viewController = IntroViewController()
let navigation = UINavigationController(rootViewController: viewController)
navigation.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Test", style: .done, target: nil, action: nil)
navigation.navigationItem.rightBarButtonItem?.tintColor = .red
let standardAppearance = UINavigationBarAppearance()
standardAppearance.backgroundColor = .black
navigation.navigationBar.standardAppearance = standardAppearance
navigation.navigationBar.scrollEdgeAppearance = standardAppearance
window.rootViewController = navigation
self.window = window
window.makeKeyAndVisible()
}
不幸的是,此代码没有向任何视图控制器上的导航控制器添加任何条形按钮项。
但是,当我将这行代码添加到viewDidLoad中的一个视图控制器时,它只会将导航栏按钮项添加到该视图控制器。
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Exit", style: .plain, target: self, action: #selector(exitPressed))
有没有一种方法可以通过编程将条形按钮项添加到导航控制器中的所有视图控制器中。
有几种方法可以做到这一点。
使SceneDelegate
成为导航控制器的代表,然后将按钮添加到所示的任何视图控制器中。
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Exit", style: .plain, target: self, action: #selector(exitPressed))
}
创建一个视图控制器子类,该子类只设置右栏按钮项。然后每个需要按钮的屏幕都可以将其子类化。
class ExitButtonViewController: UIViewController {
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Exit", style: .plain, target: self, action: #selector(exitPressed))
}
func exitPressed() {
// add a common implementation or require the subclass to add one.
}
}
制定一个协议,可以简化在多个视图控制器中添加按钮。
protocol Exitable: NSObjectProtocol {
func exitPressed()
}
extension Exitable where Self: UIViewController {
func setupExitButton() {
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Exit", style: .plain, target: self, action: #selector(exitPressed))
}
}
class SomeViewController: UIViewController, Exitable {
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
setupExitButton()
}
func exitTapped() {
// Do something
}
}