Устранение неполадок при ссылке на UIButton с помощью NSMutableAttributedString в реализованном контроллере представления - PullRequest
0 голосов
/ 10 декабря 2018

Как только мой контроллер просмотра загружается, мне предоставляется кнопка (серый фон с белым шрифтом), которая отображает текст «Sto 1».Это вызывается в viewWillLayoutSubviews, и заголовок устанавливается с помощью NSMutableAttributedString.«Сто» - это сокращение от магазина.

Для моего приложения я бы хотел, чтобы пользователь мог выбрать кнопку Sto 1 и сохранить число, представленное на UILabel.Я могу получить текущее отображаемое число, но не могу обновить текст внутри кнопки Sto 1 с помощью NSMutableAttributedString.Другими словами, я хочу перейти от кнопки «Sto 1» к отображению некоторого числа (например, 12).

Спасибо всем за любую помощь, которую вы можете мне оказать.Я все еще относительно новичок в Swift, и я пытался решить эту проблему на прошлой неделе.

import UIKit

class ViewController: UIViewController {


var fontConstant = CGFloat()
var someRandomNumberDisplayedOnAUILabel = String(12)

@IBOutlet weak var myButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

}

override func viewWillLayoutSubviews() {

    fontConstant = 1
    let myString = "Sto 1"
    let myAttributes = [NSAttributedString.Key.foregroundColor :  UIColor(red: 251/255.0, green: 251/255.0, blue: 251/255.0, alpha: 1.0), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 10 * fontConstant)]
    let mutableAttributedString = NSMutableAttributedString(string: myString, attributes: myAttributes)
    myButton.setAttributedTitle(mutableAttributedString, for: .normal)
    myButton.backgroundColor = UIColor(red: 94/255.0, green: 94/255.0, blue: 94/255.0, alpha: 1.0)

}


@IBAction func myButtonAction(_ sender: Any) {

    let myAttributes = [NSAttributedString.Key.foregroundColor :  UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 10 * fontConstant)]
    let mutableAttributedString = NSMutableAttributedString(string: someRandomNumberDisplayedOnAUILabel, attributes: myAttributes)
    myButton.setAttributedTitle(mutableAttributedString, for: .normal)
    myButton.backgroundColor = UIColor(red: 251/255.0, green: 251/255.0, blue: 251/255.0, alpha: 1.0)

}}

1 Ответ

0 голосов
/ 10 декабря 2018

Обычно вы используете setTitle (: for:) , чтобы изменить текст на UIButton.Но поскольку вы работаете с NSMutableAttributedString, вам потребуется функция setAttributedTitle (: for:) .Я думаю, что это может быть то, что вы ищете:

myButton.setAttributedTitle(myNSMutableAttributedString, for: .normal)

Хедз-ап, хотя.Возможно, вам придется вызывать эту функцию для разных состояний управления, а не только для .normal, иначе вы можете на мгновение увидеть другой текст, когда кнопка подсвечена. Здесь - это список состояний управления.

РЕДАКТИРОВАТЬ:
Я бы попытался ссылаться на отправителя в IBAction вместо myButton.Это может быть быстрое решение:

@IBAction func myButtonAction(_ sender: Any) {

    let myAttributes = [NSAttributedString.Key.foregroundColor :  UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 10 * fontConstant)]
    let mutableAttributedString = NSMutableAttributedString(string: someRandomNumberDisplayedOnAUILabel, attributes: myAttributes)

    guard let button = sender as? UIButton else {
        print("Error: sender was not a button")
        return
    }
    button.setAttributedTitle(mutableAttributedString, for: .normal)
    button.backgroundColor = UIColor(red: 251/255.0, green: 251/255.0, blue: 251/255.0, alpha: 1.0)

}

РЕДАКТИРОВАТЬ # 2:
Если вы потеряете ссылку на ваш IBOutlet, вы можете обойти это,назначив селектор кнопке до , вы потеряете ее.Попробуйте это:

override func viewDidLoad() {
    super.viewDidLoad()

    // Add the action to the button rather than holding on to the IBOutlet
    myButton.addTarget(self, action: #selector(RideInProgressViewController.myAction(sender:)), for: .touchUpInside)
}

@objc private func myAction(sender: Any) {
    guard let button = sender as? UIButton else {
        print("Error: sender was not a button")
        return
    }

    let myAttributes = [NSAttributedString.Key.foregroundColor :  UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 10 * fontConstant)]
    let mutableAttributedString = NSMutableAttributedString(string: someRandomNumberDisplayedOnAUILabel, attributes: myAttributes)

    button.setAttributedTitle(mutableAttributedString, for: .normal)
    button.backgroundColor = UIColor(red: 251/255.0, green: 251/255.0, blue: 251/255.0, alpha: 1.0)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...