Как отправить строковые данные в тег UIButton?

#ios #swift #uibutton

#iOS #swift #uibutton

Вопрос:

Есть ли какой-либо способ отправки строкового значения в UIButton тег? Я знаю tag , что это тип Int, но мне нужно отправить строковое значение.

 let myButton: UIButton = {
    let button = UIButton()
    button.tag = "123"
    return button
}()
  

Мне нужно отправить button.tag в виде строки

Комментарии:

1. accessibilityIdentifier Вместо этого используйте свойство.

2. Тип данных tag свойства Int (он определяется UIView и наследуется UIButton ). Вы не можете изменить тип данных, следовательно, невозможно присвоить строку этому свойству. Если вы можете более подробно рассказать о том, чего вы хотите достичь, может быть шанс, что кто-нибудь сможет помочь вам с возможным решением вашей проблемы, но, как я уже сказал, короткий ответ на ваш вопрос — нет .

3. accessibilityIndetifier помог мне, спасибо

Ответ №1:

Создайте пользовательский класс UIButton и создайте одно String свойство типа, например customTag

 class CustomButton: UIButton {
    var customTag:String = ""
}
  

Назначьте пользовательский класс своему UIButton и используйте тег строкового типа, следуя следующему коду.

 let myButton: CustomButton = {
    let button = CustomButton()
    button.customTag = "ABC"
    return button
}()
  

Комментарии:

1. спасибо, но я использовал accessibilityLabel для строки в UIButton

2. Хорошо, это не проблема, но таким образом вы можете добавить одно или несколько пользовательских свойств (переменных) UIButton.

3. (неправильно) использование метки доступности — не очень хорошая идея. Это испортит VoiceOver для пользователей с ослабленным зрением (VoiceOver будет произносить текст, который вы вводите в ярлык доступности.)

4. Идентификатор доступности также не очень хорош, поскольку он используется для тестирования AppleUI. Если у вас нет никаких тестов AppleUI, это не повлияет на вас, но это может вызвать проблемы, если вы разработаете тесты пользовательского интерфейса позже.

Ответ №2:

Вместо тега вы можете сделать это с помощью accessibilityLabel .

 btn.accessibilityLabel = "ABC"
  

Комментарии:

1. Спасибо, это именно то, что я хотел.

Ответ №3:

Еще один ответ.

Вместо accessibilityLabel / accessibilityIdentifier или любого другого, связанного с accessibility , давайте перейдем к layer.name

 Button.layer.name = "abc123"

@IBAction func wasPressed(_ sender: UIButton) {
   print("was Pressed     (sender.layer.name)")
}
  

Причина:

В случае, нам необходимо установить доступность для каждого экрана, в то время это может повлиять.

Но, если нам нужно добавить еще один слой UIButton , это не повлияет

Ответ №4:

К сожалению, тег представляет собой всего лишь целочисленное значение. Что вы могли бы сделать, это:

  • Создайте подкласс UIButton и добавьте свое собственное свойство
  • Используйте связанные объекты, как в https://gist.github.com/mjjimenez/7956352
  • Используйте перечисления для тега; возможно, добавьте расширение для доступа к ним
  • (Неправильно) используйте accessibilityIdentifier

Ответ №5:

Просто создайте extension из UIButton или NSObject .

 extension NSObject {
    private struct AssociatedKeys {
        static var DescriptiveName = "strCustomTag"
    }

    var strCustomTag: String? {
        get {
            return objc_getAssociatedObject(self, amp;AssociatedKeys.DescriptiveName) as? String
        }

        set {
            if let newValue = newValue {
                objc_setAssociatedObject(
                    self,
                    amp;AssociatedKeys.DescriptiveName,
                    newValue as NSString?,
                    .OBJC_ASSOCIATION_RETAIN_NONATOMIC
                )
            }
        }
    }
}
  

Обратитесь к приведенному ниже коду, чтобы установить значение strCustomTag

 let myButton: UIButton = {
    let button = UIButton()
    button.strCustomTag = "ABC"
    return button
}()
  

Получить значение

 print(view.strCustomTag)
  

Если вы создаете extension NSObject

strCustomTag доступен из любого класса или любых элементов пользовательского UIButton UITextField интерфейса, таких как , и т.д. UIView

Нет необходимости изменять в exsting storyboard ИЛИ XIB file

Комментарии:

1. Спасибо accessibilityLabel мне помогло

Ответ №6:

Невозможно установить для тега значение String, поскольку его тип — Int .

Скорее всего, вам все равно не нужно будет его устанавливать, потому что использование тега UIView не является распространенным методом.

Если вы все еще хотите использовать подобное решение (я не рекомендую этого делать), вы можете использовать accessibilityIdentifier свойство String .

Также вы можете создать пользовательский подкласс UIButton с пользовательским свойством String и использовать этот пользовательский подкласс вместо UIButton

Ответ №7:

Вы можете создать пользовательский класс для button, затем вы можете передавать любые значения, просто определив свойство в пользовательском классе.

Пример: я хочу передать String и Int оба значения в Button, поэтому я передам Int в тег button, а строка будет передана в пользовательском свойстве button.

 class CustomButton: UIButton {
    var stringToPass: String = ""
}

  

Класс ViewController

 class HomeVC: UIViewController {

    let customButton = CustomButton()

    override func viewDidLoad() {
        super.viewDidLoad()

        customButton.stringToPass = "Your String"
    }
}