I am working with one project on Xcode with SnapKit and without storyboard.
I didn’t touch AppDelegate.
I have this code on 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()
}
}
Project’s hierarchy like that:
- HomePage(Group)
- TabBarController
- ViewController
- HomeCollectionViewCell
-
ShopPage(Group)
… -
MessagePage(Group)
… -
ProfilePage(Group)
- ProfileViewController
- SettingsViewController
I want to open SettingsViewController when settingsButton(on ProfileViewController) tapped.
This is my code in the 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
}
}
This is my code in the 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()
}
}
}
But when I tap settingButton nothing happens.
I tried to set rootViewController like that on Scene Delegate:
window?.rootViewController = UINavigationController(rootViewController: TabBarController())
Also I tried here set ProfileViewController as a rootViewController
Also I tried with present method:
@objc private func openSettings() {
let settingsViewController = SettingsViewController()
present(settingsViewController, animated: true)
}




