2016-05-23 7 views
2

Ich möchte alle meine Ansichten haben eine Eigenschaft wie ein Tag gespeichert, aber es muss Art von String sein. Also habe ich versucht, eine Erweiterung dafür zu verwenden.Wie erstellt man eine Erweiterung von UIView mit einem variablen String-Parameter in Swift?

Aber ich habe den Fehler, dass Erweiterungen meine gespeicherten Eigenschaften nicht enthalten.

Die Frage ist, wie eine Zeichenfolge in jeder UIView in meiner App wie ein Tag gespeichert werden?

Danke!

+0

Eine andere hier: http://stackoverflow.com/a/25428363/1187415. –

Antwort

1

Sie können keine Kategorien (Swift-Erweiterungen) mit neuem Speicher definieren; Alle zusätzlichen Eigenschaften müssen berechnet und nicht gespeichert werden. In Swift müssen Sie diese selbst definieren, um eine berechnete Eigenschaft zu erhalten. so etwas wie:

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

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

Wie stellst du es ein? –

+0

set {set (newValue)} –

0
class CustomView:UIView{ 
     var customTag:String? 
    } 
  1. Sie haben eine benutzerdefinierte Ansicht erstellen, deren übergeordnete Klasse ist UIView.
  2. Fügen Sie eine Eigenschaft des Typs string in diese Klasse ein.
  3. Ändern Sie den Typ Ihrer Sicht in die customView, die Sie erstellt haben, indem Sie UIView erweitern.
+0

Ich verwende bereits Unterklassen für verschiedene Arten von Sichten. zB MyCustomButton, MyCustomImageView und ich wollten nicht jeden stringTag Parameter hinzufügen, wenn ich es vermeiden könnte. –

-1

Wenn alle Sie suchen, einen Blick "Tag" wie ist aber in Typ String, benutzen Sie einfach:

accessibilityIdentifier

Beispiel programmatisch:

myView.accessibilityIdentifier = @"YOYO"; 

Beispiel über Storyboard:

enter image description here

keine Erweiterungen erforderlich sind, und auch, wird später auf Sie in der Lage sein, von profitieren, wenn Sie UIAutomation Tests auf Ihrer App als UIAutomation verwenden accessibilityIdentifier laufen Ansichten zu identifizieren :)

+0

Dies ist in der Tat die einfachste Lösung für ein Problem, aber ich möchte auch Erweiterungen erkunden. Vielen Dank! –

+0

@ JacobSmith, es ist nicht nur die einfachste Lösung, es ist auch die empfohlene Lösung von Apple. Aber Erweiterungen sind gut zu wissen, viel Glück! –

+0

Dies ist eine missbräuchliche Verwendung von 'accessibilityIdentifier'. Erweiterungen ist der Weg zu gehen. https://developer.apple.com/reference/uikit/uaccessibilityidentification/1623132-accessibilityidentifier?language=objc –

6

Sie können die Verwendung setAssociatedObject und getAssociatedObject in der Ziel-c-Laufzeit definiert, um dies zu erreichen.

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) 
     } 
    } 
} 

können Sie diese beziehen blog für weitere Details.

+0

Mit Ihrer optionalen Bindung würde 'myView.myOwnTag = nil' den Eigenschaftswert unverändert lassen, anstatt ihn auf 'null' zu setzen. –

+0

@MartinR: Sie sind richtig, ich habe meine Antwort aktualisiert. –

0

Sie können eine Klasse wie dieses

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

erstellen und lassen Sie Ihre Sicht: diese Klasse.

Verwandte Themen