问题:当我按住导航栏后退按钮时,它显示一个空矩形。需求:如何禁用此行为,但在同一时间,我想保持后退按钮的存在和功能,但没有长触摸显示这个矩形。100d1x的字符串注意:我使用UIKit
ou6hu8tu1#
这不是一个简单的矩形。这实际上是一个显示导航堆栈的菜单。如果你导航得更深,它会有更多的按钮。这不能用普通的API摆脱,但你可以用一些搅拌来解决它:1.执行此操作:
private func swizzle( targetClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector ) { let originalMethod = class_getInstanceMethod(targetClass, originalSelector) let swizzledMethod = class_getInstanceMethod(targetClass, swizzledSelector) method_exchangeImplementations(originalMethod!, swizzledMethod!) } extension UIViewController { static let classInit: Void = { let originalSelector = #selector(viewWillAppear(_:)) let swizzledSelector = #selector(swizzledViewWillAppear(_:)) swizzle( targetClass: UIViewController.self, originalSelector: originalSelector, swizzledSelector: swizzledSelector ) }() @objc func swizzledViewWillAppear(_ animated: Bool) { if #available(iOS 14.0, *) { let backButton = BackBarButtonItem(title: "", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backButton } swizzledViewWillAppear(animated) } } class BackBarButtonItem: UIBarButtonItem { @available(iOS 14.0, *) override var menu: UIMenu? { get { super.menu } set { } } }
字符串1.在早期调用UIViewController.classInit(例如SwiftUI中的视图的init或UIKit中的视图控制器):
UIViewController.classInit
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UIViewController.classInit return true } }
型
struct SomeView: View { init() { UIViewController.classInit } ,,, }
型关键是在导航初始化之前把它放在任何地方!x1c 0d1x的数据
除了上面的方法,你可以设置正确的导航标题名称onDisappear,使其按预期工作:
onDisappear
struct NavigationTesting: View { @State var title: LocalizedStringKey = " " var body: some View { NavigationStack { NavigationLink("Next") { Text("View 2") } .navigationTitle(title) .onDisappear { title = "Page 1" } .onAppear { title = " " } } } }
型这样你就可以用正确的名称填充菜单,并按预期隐藏“后退”标题。
的
1条答案
按热度按时间ou6hu8tu1#
这不是一个简单的矩形。这实际上是一个显示导航堆栈的菜单。如果你导航得更深,它会有更多的按钮。这不能用普通的API摆脱,但你可以用一些搅拌来解决它:
1.执行此操作:
字符串
1.在早期调用
UIViewController.classInit
(例如SwiftUI中的视图的init或UIKit中的视图控制器):UIKit demo - AppDelegate
型
SwiftUI演示
型
关键是在导航初始化之前把它放在任何地方!
x1c 0d1x的数据
💡
除了上面的方法,你可以设置正确的导航标题名称
onDisappear
,使其按预期工作:型
这样你就可以用正确的名称填充菜单,并按预期隐藏“后退”标题。
的