swift 如何在iOS中以编程方式推送另一个页面?

uyto3xhc  于 2024-01-05  发布在  Swift
关注(0)|答案(1)|浏览(140)

我正在使用Xcode上的一个项目,使用SnapKit,不使用故事板。我没有接触AppDelegate。我在SceneDelegate上有这个代码。

  1. import UIKit
  2. class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  3. var window: UIWindow?
  4. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
  5. guard let windowScene = (scene as? UIWindowScene) else { return }
  6. window = UIWindow(windowScene: windowScene)
  7. window?.makeKeyAndVisible()
  8. window?.rootViewController = TabBarController()
  9. }
  10. }

字符串
项目的层次结构是这样的:

  • 首页(集团)
  1. TabBarController
  2. ViewController
    1.首页收藏视图单元格
  • ShopPage(Group).
  • MessagePage(Group).
  • 个人资料页(集团)
  1. ProfileViewController
    1.设置视图控制器
    我想在点击settingsButton(在ProfileViewController上)时打开SettingsViewController。
    这是我在TabBarController中的代码:
  1. import UIKit
  2. class TabBarController: UITabBarController {
  3. override func viewDidLoad() {
  4. super.viewDidLoad()
  5. self.setupTabs()
  6. selectedIndex = 3
  7. tabBar.backgroundColor = .systemBackground
  8. tabBar.tintColor = UIColor(red: 0, green: 155/255, blue: 247/255, alpha: 1)
  9. }
  10. //MARK: - Tab Setup
  11. private func setupTabs(){
  12. let home = self.createNav(title: "Home", image: UIImage(systemName: "house"), vc: ViewController())
  13. let shop = self.createNav(title: "Shop", image: UIImage(systemName: "bag"), vc: ShopViewController())
  14. let message = self.createNav(title: "Message", image: UIImage(systemName: "ellipsis.message"), vc: MessageViewController())
  15. let profile = self.createNav(title: "Profile", image: UIImage(systemName: "person"), vc: ProfileViewController())
  16. self.setViewControllers([home, shop, message, profile], animated: true)
  17. }
  18. private func createNav(title: String, image: UIImage?, vc: UIViewController) -> UINavigationController{
  19. let nav = UINavigationController(rootViewController: vc)
  20. nav.tabBarItem.title = title
  21. nav.tabBarItem.image = image
  22. return nav
  23. }
  24. }


这是我在ProfileViewController中的代码:

  1. class ProfileViewController: UIViewController {
  2. private lazy var settingButton: UIButton = {
  3. let button = UIButton()
  4. button.setImage(UIImage(systemName: "gearshape"), for: .normal)
  5. button.addTarget(self, action: #selector(openSettings), for: .touchUpInside)
  6. return button
  7. }()
  8. override func viewDidLoad() {
  9. super.viewDidLoad()
  10. view.backgroundColor = UIColor(red: 250/255, green: 250/255, blue: 250/255, alpha: 1)
  11. setupUI()
  12. }
  13. @objc private func openSettings() {
  14. let settingsViewController = SettingsViewController()
  15. navigationController?.pushViewController(settingsViewController, animated: true)
  16. }
  17. }
  18. private extension ProfileViewController {
  19. func setupUI() {
  20. setupViews()
  21. setupConstraints()
  22. }
  23. func setupViews() {
  24. view.addSubview(settingButton)
  25. }
  26. func setupConstraints() {
  27. settingButton.snp.makeConstraints { make in
  28. make.center.equalToSuperview()
  29. }
  30. }
  31. }


但当我点击设置按钮什么也没发生。
我尝试在场景委托上设置rootViewController:window?.rootViewController = UINavigationController(rootViewController: TabBarController())
我还尝试在这里设置ProfileViewController作为rootViewController
我也尝试了现在的方法:

  1. @objc private func openSettings() {
  2. let settingsViewController = SettingsViewController()
  3. present(settingsViewController, animated: true)
  4. }

编辑

对不起,我以为这部分代码与我的问题无关,没有提供给你。我的代码是这样的:

  1. class ProfileViewController: UIViewController {
  2. private lazy var topView: UIView = {
  3. let view = UIView()
  4. return view
  5. }()
  6. private lazy var topTitle: UILabel = {
  7. let label = UILabel()
  8. label.text = "Profile"
  9. label.font = UIFont.boldSystemFont(ofSize: 19)
  10. return label
  11. }()
  12. private lazy var settingButton: UIButton = {
  13. let button = UIButton()
  14. button.setImage(UIImage(systemName: "gearshape"), for: .normal)
  15. button.addTarget(self, action: #selector(openSettings), for: .touchUpInside)
  16. return button
  17. }()
  18. override func viewDidLoad() {
  19. super.viewDidLoad()
  20. setupUI()
  21. }
  22. @objc private func openSettings() {
  23. print("button")
  24. let settingsViewController = SettingsViewController()
  25. navigationController?.pushViewController(settingsViewController, animated: true)
  26. }
  27. }
  28. // MARK: - setting iui methods
  29. private extension ProfileViewController {
  30. func setupUI() {
  31. setupViews()
  32. setupConstraints()
  33. view.backgroundColor = .systemBackground
  34. }
  35. func setupViews() {
  36. view.addSubview(topView)
  37. topView.addSubview(topTitle)
  38. topView.addSubview(settingButton)
  39. }
  40. func setupConstraints() {
  41. topView.snp.makeConstraints { make in
  42. make.top.equalToSuperview().offset(50)
  43. make.leading.trailing.equalToSuperview()
  44. make.height.equalToSuperview().multipliedBy(0.08)
  45. }
  46. topTitle.snp.makeConstraints { make in
  47. make.center.equalToSuperview()
  48. }
  49. settingButton.snp.makeConstraints { make in
  50. make.trailing.equalToSuperview().offset(-10)
  51. make.height.equalToSuperview().multipliedBy(0.4)
  52. make.width.equalToSuperview().multipliedBy(0.15)
  53. make.centerY.equalToSuperview()
  54. }
  55. }
  56. }


但事实证明,问题是在顶视图,但我不知道确切的原因。如果我的按钮是在顶视图它没有按下,但如果外面那么一切正常。

huus2vyu

huus2vyu1#

你的每个标签都有一个UINavigationController.
因此,您的“Profile”选项卡有一个UINavigationController,根视图控制器为ProfileViewController.
然后将topView添加为ProfileViewController视图的子视图,并将其约束到该 * 视图**的顶部--忽略安全区域,其中包括导航栏。
如果我修改你的代码来添加一些背景颜色:

  1. override func viewDidLoad() {
  2. super.viewDidLoad()
  3. setupUI()
  4. topView.backgroundColor = .yellow
  5. navigationController?.navigationBar.backgroundColor = .green.withAlphaComponent(0.5)
  6. }

字符串
它看起来像这样:
x1c 0d1x的数据
您不能点击被导航栏覆盖的按钮(或任何其他UI元素)。
如果你想在导航栏上有一个“标题”和一个右侧按钮,可以用导航栏来管理。

  1. class ProfileViewController: UIViewController {
  2. override func viewDidLoad() {
  3. super.viewDidLoad()
  4. view.backgroundColor = .systemBackground
  5. // don't call anything in your current setupUI() func
  6. //setupUI()
  7. self.title = "Profile"
  8. let b = UIBarButtonItem(image: UIImage(systemName: "gearshape"), style: .plain, target: self, action: #selector(openSettings))
  9. navigationItem.rightBarButtonItem = b
  10. }
  11. @objc private func openSettings() {
  12. print("button")
  13. let settingsViewController = SettingsViewController()
  14. navigationController?.pushViewController(settingsViewController, animated: true)
  15. }
  16. }


现在,它看起来像这样:



点击齿轮按钮调用openSettings()

展开查看全部

相关问题