UILabel показывает неправильную локализованную строку

У меня проблема с локализацией строки через Localizable.stringdict. Я настроил разные локализации для разных размеров тестовой строки. См. Localizable.stringdict:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Test</key>
    <dict>
        <key>NSStringVariableWidthRuleType</key>
        <dict>
            <key>20</key>
            <string>test</string>
            <key>25</key>
            <string>test message</string>
            <key>50</key>
            <string>This is a test message</string>
        </dict>
    </dict>
</dict>
</plist>

Мой ViewController выглядит следующим образом:

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let string = NSLocalizedString("Test", comment: "This is a test message") as NSString
        let widthFormattedString = string.variantFittingPresentationWidth(50) as String

        print(widthFormattedString)
        label.text = widthFormattedString
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Я хотел бы присвоить локализованную строку метке. Печать в моем ViewController печатает «Это тестовое сообщение», но в представлении отображается «тестовое сообщение». Я больше нигде не меняю текст этикетки. Поэтому мне интересно, почему отображается неправильное сообщение. Кто-нибудь может помочь?


person cb89    schedule 31.07.2017    source источник
comment
Localizable.stringdict: вы говорите о файле localizable.strings?   -  person Ellen    schedule 31.07.2017
comment
Нет, есть файл localizable.stringdict, в котором вы можете указать разные тексты для разных размеров.   -  person cb89    schedule 31.07.2017
comment
Вы заявили, что «печать в моем ViewController печатает это тестовое сообщение, но представление показывает тестовое сообщение», но оно будет печатать только тест, поскольку это ключ.   -  person Manikanta Chintapalli    schedule 31.07.2017
comment
Нет, это не просто печать ключа. Он использует Localizable.stringdict, но печатает значение ключа 25, а не 50, как запрошено.   -  person cb89    schedule 31.07.2017


Ответы (1)


Согласно документации при написании этого ответа говорится что:

Примечание

Не вызывайте этот метод при настройке видимого для пользователя текста для стандартных элементов управления UIKit, таких как UILabel. UIKit обеспечивает встроенную поддержку адаптивных строк и автоматически выбирает вариант ширины строки, соответствующий текущему размеру экрана, в соответствии с поведением, описанным ниже.

что, кажется, подтверждает то, что вы испытываете.

Распечатка, которую вы делаете сами, верна, потому что она доставляет вам строку, которую вы запросили для значения 50:

Печать в моем ViewController печатается. Это тестовое сообщение.

Принимая во внимание, что UILabel получает строку стандартным механизмом UIKit и выглядит как:

но представление показывает тестовое сообщение

Я пришел к выводу, что вам не нужно делать это самостоятельно, если вы используете элементы управления UIKit. Это, вероятно, полезно для пользовательских элементов управления или других случаев использования, о которых я не знаю.

person Bruno Bieri    schedule 25.09.2020