2016-05-23 2 views
2

Я хочу, чтобы все мои представления имели свойство, хранящееся как тег, но оно должно быть типом String. Поэтому я попытался использовать расширение для него.Как создать расширение UIView с переменным строковым параметром в Swift?

Но я получил ошибку, говоря, что расширения не содержат хранимых свойств.

Вопрос в том, как хранить строку в каждом UIView в моем приложении, как тег?

Спасибо!

+0

Другой здесь: http://stackoverflow.com/a/25428363/1187415. –

ответ

1

Вы не можете определить категории (Swift extensions) с новым хранилищем; любые дополнительные свойства должны вычисляться, а не сохраняться. В Swift вам необходимо определить их самостоятельно, чтобы получить вычисленное свойство; что-то вроде:

extension String { 
public var Foo : String { 
    get 
    { 
     return "Foo" 
    } 

    set 
    { 
     // What do you want to do here? 
    } 
} 
} 
+0

Как вы его установите? –

+0

set {set (newValue)} –

0
class CustomView:UIView{ 
     var customTag:String? 
    } 
  1. Вы должны создать пользовательский вид, чей суперкласс UIView.
  2. Добавить свойство типа string в этом классе.
  3. Измените тип вашего вида на customView, который у вас есть , созданный расширением UIView.
+0

Я уже использую подклассы для разных видов просмотров. например, MyCustomButton, MyCustomImageView, и я не хотел добавлять параметр stringTag к каждому, если бы мог его избежать. –

-1

Если все, что вы ищете в вид "метки", как, но в строкового типа, просто используйте:

accessibilityIdentifier

Пример программно:

myView.accessibilityIdentifier = @"YOYO"; 

Пример с помощью раскадровки:

enter image description here

Нет расширения не нужны, а также, в дальнейшем вы сможете извлечь выгоду из этого, если вы будете запускать UIAutomation тесты на приложение как UIAutomation использовать accessibilityIdentifier отождествить точку зрения :)

+0

Это действительно самое простое решение проблемы, но я хотел бы также изучить расширения. Благодаря! –

+0

@JacobSmith, это не только самое простое решение, но и рекомендованное решение Apple. Но расширения хорошо знать, удачи! –

+0

Это оскорбительное использование «accessibilityIdentifier». Расширения - это путь. https://developer.apple.com/reference/uikit/uiaccessibilityidentification/1623132-accessibilityidentifier?language=objc –

6

Вы можете использовать setAssociatedObject и getAssociatedObject, определяемые в целях выполнения c в целях достижения этого.

import ObjectiveC 

var AssociatedObjectKey: UInt8 = 7 
extension UIView 
{ 
    var myOwnTag: String? 
    { 
     get 
     { 
      return getAssociatedObject(self, associativeKey: &AssociatedObjectKey) as? String ?? "" 
     } 

     set 
     { 
      var propertyVal : String? = nil 
      if let value = newValue 
      { 
       propertyVal = value 
      } 
      setAssociatedObject(self, value: propertyVal, associativeKey: &AssociatedObjectKey, policy: objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 
} 

Для получения более подробной информации вы можете обратиться к этому blog.

+0

С вашим необязательным связыванием 'myView.myOwnTag = nil' оставит значение свойства неизменным, а не устанавливает его в' nil'. –

+0

@MartinR: Вы правы, я обновил свой ответ. –

0

Вы можете создать класс, как этот

class TagView: UIView { 
    var stringTag: String = "" 
} 

и пусть ваш взгляд будет этот класс.

Смежные вопросы