NavigationView的自定义返回按钮文本

5
如何在推送新视图时更改NavigationView中的返回按钮文本?
默认情况下显示为“返回”,但我想要更改为其他内容。
在SwiftUI中是否可以实现这一点?
2个回答

7

完整代码:

struct SampleDetails: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var btnBack: some View {
        Button(action: {self.presentationMode.wrappedValue.dismiss()}) {
            HStack {
                Image("ic_back") // set image here
                .aspectRatio(contentMode: .fit)
                .foregroundColor(.white)
                Text("Go back")
            }
        }
    }

    var body: some View {
        List {
            Text("sample code")
        }
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(leading: btnBack)
    }
}

如需更多澄清,请点击这里


3
这会削弱导航的许多内置功能。 - krummens

0
SwiftUI 并不直接支持这个功能,但是你可以通过手动定位 UINavigationController 并更新顶部 UIViewController 的导航项来解决这个问题。
我创建了一个用户友好的 View 扩展,以便更容易实现这一点:
extension View {
    func backBarButtonTitle(_ title: String) -> some View {
        modifier(BackButtonModifier(title: title))
    }
}

// MARK: - BackButtonModifier

struct BackButtonModifier: ViewModifier {
    let title: String

    func body(content: Content) -> some View {
        content.background(BackButtonTitleView(title: title))
    }
}

// MARK: - BackButtonTitleView

private struct BackButtonTitleView: UIViewRepresentable {
    let title: String

    func makeUIView(context _: Context) -> BackButtonTitleUIView {
        BackButtonTitleUIView(title: title)
    }

    func updateUIView(_: BackButtonTitleUIView, context _: Context) {}
}

// MARK: - BackButtonTitleUIView

private final class BackButtonTitleUIView: UIView {
    // MARK: Lifecycle

    init(title: String) {
        self.title = title
        super.init(frame: .zero)
    }

    required init?(coder _: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // MARK: Internal

    override func layoutSubviews() {
        super.layoutSubviews()
        if didConfigureTitle {
            return
        }
        let topNavigationItem = searchNavigationController(currentResponder: self)?
            .topViewController?
            .navigationItem
        if let topNavigationItem {
            topNavigationItem.backButtonTitle = title
            didConfigureTitle = true
        }
    }

    // MARK: Private

    private let title: String
    private var didConfigureTitle = false

    private func searchNavigationController(currentResponder: UIResponder) -> UINavigationController? {
        if let navigationController = currentResponder as? UINavigationController {
            return navigationController
        } else if let nextResponder = currentResponder.next {
            return searchNavigationController(currentResponder: nextResponder)
        } else {
            return nil
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接