首页 > 解决方案 > 我可以将 LocalizedStringKey 用于 UIKit 视图吗?

问题描述

我正在使用协议将 a 包装UITextFieldSwiftUI视图中;UIViewRepresentable我想将 a 传递LocalizedStringKey给底层UITextFieldplaceholder. 就像是:


避免硬编码字符串并轻松查找代码中所有可本地化字符串的扩展:

extension LocalizedStringKey {
  
    let search: LocalizedStringKey = "search"

}

自定义文本字段:

struct SuperTextField: UIViewRepresentable {

    let placeholder: LocalizedStringKey


    // all UIViewRepresentable methods

    func updateUIView(_ uiView: UITextField, context: Context) {
        uiView.placeholder = placeholder // of course this doesn't compile as textField placeholder is a simple `String`
    }

}

我想要的用法:

SuperTextField(placeholder: .search) // use auto infer

我认为目前这是不可能的,因为LocalizedStringKey没有公开用于初始化它的字符串......还有其他好的方法吗?

标签: iosswiftuilocalizedstringkey

解决方案


要使此代码正常工作,您仍然需要一个.strings名为的文件,该文件Localizable.strings已被Localized您的翻译填充。

import SwiftUI

struct StringEnum: View {
    //@State var userText: String = "" //Remove comment for use with a TextField
    var body: some View {
        Text(StringLibrary.search.localize())
        //TextField(StringLibrary.search.localize(), text: $userText)
    }
}

enum StringLibrary: String {
    case search = "search"
    
    
}
extension StringLibrary{
    func localize() -> String {
        return NSLocalizedString(self.rawValue, comment: "default")
    }
}
struct StringEnum_Previews: PreviewProvider {
    static var previews: some View {
        StringEnum()
    }
}

如果您已经拥有自己的.strings使用NSLocalizedString包含tableName.

您可以StringLibrary.search.localize()在任何需要String

要在您SuperTextFieldplaceholder类型更改为StringLibrary.localize()范围内使用它SuperTextField


推荐阅读