我正在使用Xcode上的一个项目,使用SnapKit,不使用故事板。我没有接触AppDelegate。我在SceneDelegate上有这个代码。
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.makeKeyAndVisible()
window?.rootViewController = TabBarController()
}
}
字符串
项目的层次结构是这样的:
- 首页(集团)
- TabBarController
- ViewController
1.首页收藏视图单元格
- ShopPage(Group).
- MessagePage(Group).
- 个人资料页(集团)
- ProfileViewController
1.设置视图控制器
我想在点击settingsButton(在ProfileViewController上)时打开SettingsViewController。
这是我在TabBarController中的代码:
import UIKit
class TabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
self.setupTabs()
selectedIndex = 3
tabBar.backgroundColor = .systemBackground
tabBar.tintColor = UIColor(red: 0, green: 155/255, blue: 247/255, alpha: 1)
}
//MARK: - Tab Setup
private func setupTabs(){
let home = self.createNav(title: "Home", image: UIImage(systemName: "house"), vc: ViewController())
let shop = self.createNav(title: "Shop", image: UIImage(systemName: "bag"), vc: ShopViewController())
let message = self.createNav(title: "Message", image: UIImage(systemName: "ellipsis.message"), vc: MessageViewController())
let profile = self.createNav(title: "Profile", image: UIImage(systemName: "person"), vc: ProfileViewController())
self.setViewControllers([home, shop, message, profile], animated: true)
}
private func createNav(title: String, image: UIImage?, vc: UIViewController) -> UINavigationController{
let nav = UINavigationController(rootViewController: vc)
nav.tabBarItem.title = title
nav.tabBarItem.image = image
return nav
}
}
型
这是我在ProfileViewController中的代码:
class ProfileViewController: UIViewController {
private lazy var settingButton: UIButton = {
let button = UIButton()
button.setImage(UIImage(systemName: "gearshape"), for: .normal)
button.addTarget(self, action: #selector(openSettings), for: .touchUpInside)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(red: 250/255, green: 250/255, blue: 250/255, alpha: 1)
setupUI()
}
@objc private func openSettings() {
let settingsViewController = SettingsViewController()
navigationController?.pushViewController(settingsViewController, animated: true)
}
}
private extension ProfileViewController {
func setupUI() {
setupViews()
setupConstraints()
}
func setupViews() {
view.addSubview(settingButton)
}
func setupConstraints() {
settingButton.snp.makeConstraints { make in
make.center.equalToSuperview()
}
}
}
型
但当我点击设置按钮什么也没发生。
我尝试在场景委托上设置rootViewController:window?.rootViewController = UINavigationController(rootViewController: TabBarController())
我还尝试在这里设置ProfileViewController作为rootViewController
我也尝试了现在的方法:
@objc private func openSettings() {
let settingsViewController = SettingsViewController()
present(settingsViewController, animated: true)
}
型
编辑
对不起,我以为这部分代码与我的问题无关,没有提供给你。我的代码是这样的:
class ProfileViewController: UIViewController {
private lazy var topView: UIView = {
let view = UIView()
return view
}()
private lazy var topTitle: UILabel = {
let label = UILabel()
label.text = "Profile"
label.font = UIFont.boldSystemFont(ofSize: 19)
return label
}()
private lazy var settingButton: UIButton = {
let button = UIButton()
button.setImage(UIImage(systemName: "gearshape"), for: .normal)
button.addTarget(self, action: #selector(openSettings), for: .touchUpInside)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
@objc private func openSettings() {
print("button")
let settingsViewController = SettingsViewController()
navigationController?.pushViewController(settingsViewController, animated: true)
}
}
// MARK: - setting iui methods
private extension ProfileViewController {
func setupUI() {
setupViews()
setupConstraints()
view.backgroundColor = .systemBackground
}
func setupViews() {
view.addSubview(topView)
topView.addSubview(topTitle)
topView.addSubview(settingButton)
}
func setupConstraints() {
topView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(50)
make.leading.trailing.equalToSuperview()
make.height.equalToSuperview().multipliedBy(0.08)
}
topTitle.snp.makeConstraints { make in
make.center.equalToSuperview()
}
settingButton.snp.makeConstraints { make in
make.trailing.equalToSuperview().offset(-10)
make.height.equalToSuperview().multipliedBy(0.4)
make.width.equalToSuperview().multipliedBy(0.15)
make.centerY.equalToSuperview()
}
}
}
型
但事实证明,问题是在顶视图,但我不知道确切的原因。如果我的按钮是在顶视图它没有按下,但如果外面那么一切正常。
1条答案
按热度按时间huus2vyu1#
你的每个标签都有一个
UINavigationController
.因此,您的“Profile”选项卡有一个
UINavigationController
,根视图控制器为ProfileViewController
.然后将
topView
添加为ProfileViewController
视图的子视图,并将其约束到该 * 视图**的顶部--忽略安全区域,其中包括导航栏。如果我修改你的代码来添加一些背景颜色:
字符串
它看起来像这样:
x1c 0d1x的数据
您不能点击被导航栏覆盖的按钮(或任何其他UI元素)。
如果你想在导航栏上有一个“标题”和一个右侧按钮,可以用导航栏来管理。
型
现在,它看起来像这样:
的
点击齿轮按钮将调用
openSettings()