Перезагрузите BarButtonItem после нажатия (Изменить заголовок отформатированной строки) - PullRequest
0 голосов
/ 07 января 2020

Я добавил программный элемент кнопки панели, который будет изменять единицы измерения температуры для некоторых переменных между градусами Цельсия и Фаренгейта и установил его с помощью атрибутивного текста через customView.

Полужирный и наполовину стандартный текст. Какой бы блок ни был выбран, он будет выделен жирным шрифтом.

После попытки каждого метода их обновления я удалил бы их после того, как они не работали. Таким образом, в приведенном ниже коде «reload / refre sh» не предпринимается.

enter image description here

У меня есть логическое значение, которое изменяется при вызове действия. Однако я не могу получить barButtomItem для "Обновить / обновить sh" после выбора.

Я отладил и вызывается действие, переменная меняется, а форматированный текст изменяется, однако на экране он не меняется.

//MARK: - Create Navigation Bar
func createNavBar() {

    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.backgroundColor = .clear
    navigationController?.navigationBar.isTranslucent = true

    let CFLabel = UILabel()
    CFLabel.attributedText = formatCFButton()
    CFLabel.sizeToFit()
    CFLabel.isUserInteractionEnabled = true
    let tap = UITapGestureRecognizer(target: self, action: #selector(CFChanger))
    CFLabel.addGestureRecognizer(tap)


    let CFButton = UIBarButtonItem.init(customView: CFLabel)
    let addCityButton = UIBarButtonItem.init(barButtonSystemItem: .add, target: self, action: #selector(addCity))
    addCityButton.tintColor = .black

    self.navigationItem.rightBarButtonItem = addCityButton
    self.navigationItem.leftBarButtonItem = CFButton

}
   @objc func CFChanger() {
    print("CF BUTTON PRESSED AND FUNCTION ACTIVATED!")
    isCelsius = !isCelsius
}


//Change font(bold) change temperature units button
func formatCFButton() -> NSMutableAttributedString {

    let changeTempString = NSMutableAttributedString()
    let boldAttribute = [NSAttributedString.Key.font: UIFont(name: "HelveticaNeue-Bold", size: 18.0)!]
    let regularAttribute = [NSAttributedString.Key.font: UIFont(name: "HelveticaNeue-Light", size: 18.0)!]

    if isCelsius == true {
        let boldText = NSAttributedString(string: "C ", attributes: boldAttribute)
        let regularText = NSAttributedString(string: "/ F", attributes: regularAttribute)
        changeTempString.append(boldText)
        changeTempString.append(regularText)
    } else {
        let boldText = NSAttributedString(string: "F ", attributes: boldAttribute)
        let regularText = NSAttributedString(string: "C / ", attributes: regularAttribute)
        changeTempString.append(regularText)
        changeTempString.append(boldText)
    }
    return changeTempString
}

Мне удалось заставить это работать в прошлом, когда я НЕ создавал кнопку программно, добавляя этот код в функцию при нажатии кнопки. Я не уверен, как это сделать программно. (отправитель вещи)

// MARK: - Change units function
//****************************************************************************
@IBAction func changeUnitsButtonPressed(_ sender: UIButton) {
    isCelsius = !isCelsius
    var tempUnitNumber = 0
    if isCelsius == true {
        tempUnitNumber = 1
    } else {
        tempUnitNumber = 2
    }

    defaults.set(tempUnitNumber, forKey: "tempUnit")
    let changeTempString = formatCFButton()
    sender.setAttributedTitle(changeTempString, for: [])
    tableView.reloadData()
}
...