Swift Uikit 以编程方式导航到开始视图

Swift Uikit navigate to starting view programmatically

我有一个 Ios 应用构建 Swift UIKit, 所有视图都嵌入在 soryboard 的底部导航中。 我想以编程方式从按钮单击的另一个视图导航到主视图(起始视图),因此不要将其显示在当前视图上方或将其推到顶部,这样就不会出现“后退”按钮, 就像用户第一次加载应用程序一样,

我怎样才能完成这样的事情?

如果我理解得很好,请将此代码放入您的点击操作函数中:

let controller = YourStartController()
    controller.modalPresentationStyle = .fullScreen
    present(controller, animated: true, completion: nil)

如果要更换导航控制器动画:

let controller = YourStartController()
let transition = CATransition()
    transition.duration = 0.3
    transition.type = CATransitionType.push
    transition.subtype = CATransitionSubtype.fromLeft
    guard let window = view.window else { return }
    window.layer.add(transition, forKey: kCATransition)
    
    present(YourStartController, animated: false, completion: nil) // important, set animated to false

编辑

这是一个转换示例:

我的第一个控制器:

class FirstController: UIViewController {

let goToSecondButton: UIButton = {
    let b = UIButton(type: .system)
    b.layer.cornerRadius = 10
    b.clipsToBounds = true
    b.backgroundColor = .red
    b.setTitleColor(.white, for: .normal)
    b.setTitle("Go to second", for: .normal)
    b.titleLabel?.font = .systemFont(ofSize: 16, weight: .semibold)
    b.addTarget(self, action: #selector(goToSecondController), for: .touchUpInside)
    b.translatesAutoresizingMaskIntoConstraints = false
    
    return b
}()

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .black
    view.addSubview(goToSecondButton)
    goToSecondButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    goToSecondButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    goToSecondButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
    goToSecondButton.widthAnchor.constraint(equalToConstant: 200).isActive = true
    
}

@objc fileprivate func goToSecondController() {
    let controller = SecondController()
    controller.modalPresentationStyle = .fullScreen
    let transition = CATransition()
    transition.duration = 0.3
    transition.type = CATransitionType.push
    transition.subtype = CATransitionSubtype.fromRight
    guard let window = view.window else { return }
    window.layer.add(transition, forKey: kCATransition)
    
    present(controller, animated: false, completion: nil) // important, set animated to false
 }
}

我的第二个控制器:

class SecondController: UIViewController {

let backToFirst: UIButton = {
    let b = UIButton(type: .system)
    b.layer.cornerRadius = 10
    b.clipsToBounds = true
    b.backgroundColor = .white
    b.setTitleColor(.black, for: .normal)
    b.setTitle("Back To first", for: .normal)
    b.titleLabel?.font = .systemFont(ofSize: 16, weight: .semibold)
    b.addTarget(self, action: #selector(backToFirstController), for: .touchUpInside)
    b.translatesAutoresizingMaskIntoConstraints = false
    
    return b
}()

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .red
    view.addSubview(backToFirst)
    backToFirst.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    backToFirst.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    backToFirst.heightAnchor.constraint(equalToConstant: 50).isActive = true
    backToFirst.widthAnchor.constraint(equalToConstant: 200).isActive = true
    
}

@objc fileprivate func backToFirstController() {
    let controller = FirstController()
    controller.modalPresentationStyle = .fullScreen
    let transition = CATransition()
    transition.duration = 0.3
    transition.type = CATransitionType.push
    transition.subtype = CATransitionSubtype.fromLeft
    guard let window = view.window else { return }
    window.layer.add(transition, forKey: kCATransition)
    
    present(controller, animated: false, completion: nil) // important, set animated to false
 }
}

这是结果

这是一个没有过渡的例子:

我的第一个控制器:

class FirstController: UIViewController {

let goToSecondButton: UIButton = {
    let b = UIButton(type: .system)
    b.layer.cornerRadius = 10
    b.clipsToBounds = true
    b.backgroundColor = .red
    b.setTitleColor(.white, for: .normal)
    b.setTitle("Go to second", for: .normal)
    b.titleLabel?.font = .systemFont(ofSize: 16, weight: .semibold)
    b.addTarget(self, action: #selector(goToSecondController), for: .touchUpInside)
    b.translatesAutoresizingMaskIntoConstraints = false
    
    return b
}()

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .black
    view.addSubview(goToSecondButton)
    goToSecondButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    goToSecondButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    goToSecondButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
    goToSecondButton.widthAnchor.constraint(equalToConstant: 200).isActive = true
    
}

@objc fileprivate func goToSecondController() {
    let controller = SecondController()
    controller.modalPresentationStyle = .fullScreen
    present(controller, animated: true, completion: nil)
 }
}

我的第二个控制器:

class SecondController: UIViewController {

let backToFirst: UIButton = {
    let b = UIButton(type: .system)
    b.layer.cornerRadius = 10
    b.clipsToBounds = true
    b.backgroundColor = .white
    b.setTitleColor(.black, for: .normal)
    b.setTitle("Back To first", for: .normal)
    b.titleLabel?.font = .systemFont(ofSize: 16, weight: .semibold)
    b.addTarget(self, action: #selector(backToFirstController), for: .touchUpInside)
    b.translatesAutoresizingMaskIntoConstraints = false
    
    return b
}()

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .red
    view.addSubview(backToFirst)
    backToFirst.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    backToFirst.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    backToFirst.heightAnchor.constraint(equalToConstant: 50).isActive = true
    backToFirst.widthAnchor.constraint(equalToConstant: 200).isActive = true
    
}

@objc fileprivate func backToFirstController() {
    let controller = FirstController()
    controller.modalPresentationStyle = .fullScreen
    present(controller, animated: true, completion: nil)
  }
}

这是结果: