shouldPerformSegue
是 iOS 开发中用于在 segue(导航)发生前进行条件判断的方法。如果你不想使用带有标识符的 shouldPerformSegue
,可以考虑以下几种替代方案:
UIStoryboardSegue
的子类你可以创建一个自定义的 UIStoryboardSegue
子类,并在其中实现条件判断逻辑。
class ConditionalSegue: UIStoryboardSegue {
override func perform() {
if shouldPerform() {
super.perform()
}
}
func shouldPerform() -> Bool {
// 在这里实现你的条件判断逻辑
return true // 或者 false
}
}
然后在Storyboard中将 segue 的类设置为 ConditionalSegue
。
定义一个协议来处理 segue 的条件判断。
protocol SegueHandlerDelegate: AnyObject {
func shouldPerformSegue(withIdentifier identifier: String) -> Bool
}
在你的 ViewController 中实现这个协议。
class MyViewController: UIViewController, SegueHandlerDelegate {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier {
if !shouldPerformSegue(withIdentifier: identifier) {
segue.source?.navigationController?.popViewController(animated: true)
}
}
}
func shouldPerformSegue(withIdentifier identifier: String) -> Bool {
// 在这里实现你的条件判断逻辑
return true // 或者 false
}
}
在 ViewController 中定义一个闭包来处理 segue 的条件判断。
class MyViewController: UIViewController {
var shouldPerformSegueClosure: ((String?) -> Bool)?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier, !shouldPerformSegueClosure?(identifier) {
segue.source?.navigationController?.popViewController(animated: true)
}
}
}
然后在需要的地方设置闭包。
let viewController = MyViewController()
viewController.shouldPerformSegueClosure = { [weak self] identifier in
// 在这里实现你的条件判断逻辑
return true // 或者 false
}
如果你使用的是 UINavigationController,可以实现其代理方法来进行条件判断。
extension MyViewController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if let identifier = navigationController.topViewController?.restorationIdentifier, !shouldPerformSegue(withIdentifier: identifier) {
navigationController.popViewController(animated: true)
}
}
func shouldPerformSegue(withIdentifier identifier: String) -> Bool {
// 在这里实现你的条件判断逻辑
return true // 或者 false
}
}
然后在 AppDelegate 中设置代理。
let navigationController = UINavigationController(rootViewController: MyViewController())
navigationController.delegate = MyViewController()
这些替代方案适用于以下场景:
通过这些替代方案,你可以灵活地控制 segue 的执行,而不必依赖于带有标识符的 shouldPerformSegue
方法。
领取专属 10元无门槛券
手把手带您无忧上云