Estoy usando una categoría NSAttributedString (Adiciones) y realmente necesito una forma de agregar una propiedad que será un BOOL si la cadena es una etiqueta HTML o no. Sé que las categorías no deberían tener propiedades, pero así es como debo hacerlo. Me cansé de escribir mis propios getters y setters, pero no funcionó. Alguien sabe una forma de cómo esto funcionaría?¿Cómo agregar la propiedad BOOL a una categoría?
Respuesta
Las categorías pueden tener propiedades de solo lectura, simplemente no puede agregar variables de instancia con ellas (bueno, puede, por ejemplo, ver referencias asociativas).
Puede agregar un método de categoría (presentado por una propiedad de solo lectura) isHTMLTag
que devolvería un BOOL, solo tendría que calcular si se trataba de una etiqueta HTML cada vez dentro de ese método.
Si está pidiendo una manera de establecer el valor BOOL entonces usted tendrá que utilizar referencias asociadas (objc_setAssociatedObject
) que nunca he usado así que no se siente calificado para responder sobre con mayor detalle.
¡Se trabajó con referencias asociadas! Gracias – Mace
¿Le importaría compartir cómo realmente lo hizo funcionar? –
@Mace - ¿puedes aceptar la respuesta de jrturton y agregar los detalles de Joshua, o aceptar la respuesta de Joshua ...? –
Si realmente necesita agregar una propiedad, debe crear una subclase en lugar de agregar una categoría.
A veces eso no es posible. Por ejemplo, si el código que crea la instancia de dicha clase no es accesible (por ejemplo, en una biblioteca estática). –
En aras de la exhaustividad, esto es cómo llegué a esto funcione:
@interface
@interface ClassName (CategoryName)
@property (readwrite) BOOL boolProperty;
@end
@implementation
#import <objc/runtime.h>
static char const * const ObjectTagKey = "ObjectTag";
@implementation ClassName (CategoryName)
- (void) setBoolProperty:(BOOL) property
{
NSNumber *number = [NSNumber numberWithBool: property];
objc_setAssociatedObject(self, ObjectTagKey, number , OBJC_ASSOCIATION_RETAIN);
}
- (BOOL) boolProperty
{
NSNumber *number = objc_getAssociatedObject(self, ObjectTagKey);
return [number boolValue];
}
@end
¿Qué hay de la gestión de memoria? La instancia de NSNumber se conserva por sí misma dentro del método -setBoolProperty :. ¿Debo liberarlo de alguna manera? Desde runtime.h: "@ param value El valor para asociar con la clave de un objeto. Pase nil para borrar una asociación existente". Pero no puedo anular dealloc en una categoría. – igrek
Encontró una respuesta aquí: http://stackoverflow.com/questions/10842829/will-an-associated-object-be-released-automatically/10843510#10843510 Se lanzó correctamente – igrek
Por cierto, puede omitir el uso de constantes adicionales para Llaves; en su lugar, simplemente use @selector (boolProperty) en lugar de ObjectTagKey, que proporcionará exactamente lo que necesita – igrek
Mi solución sin la necesidad de una clave de objeto y una sintaxis un poco más fácil de leer
NSString + Ayuda er.h
#import <Foundation/Foundation.h>
@interface NSString (Helper)
@property (nonatomic, assign) BOOL isHTML;
@end
NSString + helper.h
#import "NSString+Helper.h"
#import "objc/runtime.h"
@implementation NSString (Helper)
- (void)setIsHTML:(BOOL)isHTML
{
NSNumber *isHTMLBool = [NSNumber numberWithBool:isHTML];
objc_setAssociatedObject(self, @selector(isHTML), isHTMLBool, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isHTML
{
NSNumber *isHTMLBool = objc_getAssociatedObject(self, @selector(isHTML));
return isHTMLBool.boolValue;
}
@end
Probablemente muy tarde en este mundo, cuando ya se está barriendo rápidamente objetivo c. De todos modos, con Xcode 8, también puede usar propiedades de clase, en lugar de usar referencias asociativas.
@interface ClassName (CategoryName)
@property (class) id myProperty;
@end
@implementation
static id *__myProperty = nil;
+ (id)myProperty {
return __myProperty;
}
+ (void)setMyProperty:(id)myProperty {
__myProperty = myProperty;
}
@end
De las notas de la versión Xcode 8:
Objective-C ahora es compatible con las propiedades de clase, los cuales interactúan con propiedades de tipo Swift. Se declaran como: @property (clase) NSString * someStringProperty ;. Ellos nunca son sintetizados. (23891898)
Swift 3:
El uso de este método, se puede añadir cualquier nueva propiedad (en este caso agregar valor Bool) a la clase emocionante.
import ObjectiveC
private var xoAssociationKey: UInt8 = 0
extension <ClassName> {
var <propertyName>: Bool! {
get {
if let returnVal = objc_getAssociatedObject(self, &xoAssociationKey) as? Bool{
return returnVal
}else{
return false
}
}
set(newValue) {
objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
}
- 1. Agregar una propiedad personalizada a Entity Framework?
- 2. El uso de una propiedad BOOL
- 3. Forma correcta de configurar una propiedad BOOL
- 4. cómo agregar imágenes a cada categoría en wordpress?
- 5. Delphi: ¿Cómo puedo agregar una nueva categoría en ActionManager?
- 6. Agregar propiedad a la matriz de Javascript
- 7. en Objective-C, cómo acceder a la propiedad privada de la categoría
- 8. ¿Cómo agregar una nueva propiedad a un objeto?
- 9. Cómo agregar una propiedad a un módulo en boost :: python?
- 10. ¿Cómo funciona una categoría?
- 11. Agregar propiedad CSS a jQuery
- 12. ¿Establecer categoría de propiedad para el control personalizado de WPF?
- 13. moldeada bool anulable a bool
- 14. ¿Cómo agregar propiedades a NSMutableArray a través de la extensión de categoría?
- 15. vinculando un usercontrol al opuesto de una propiedad bool
- 16. C# Convertir una acción a otra <bool>
- 17. ¿Cómo agregar una categoría a Magento mediante el script de configuración?
- 18. ¿Cómo agregar un campo de imagen personalizado a una categoría en Magento?
- 19. Código EF4 Primero: cómo agregar una relación sin la adición de una propiedad de navegación
- 20. ¿Cómo se muestra una propiedad bool como Sí | No en la cuadrícula de propiedades?
- 21. Categorías de Objective-C: ¿Puedo agregar una propiedad para un método que no esté en mi categoría?
- 22. Highcharts, alternar una categoría?
- 23. Agregar nueva propiedad a cada documento en una gran colección
- 24. Agregar un nodo/propiedad a un árbol de expresiones
- 25. Agregar Propiedad auto-implementada a la clase usando Roslyn
- 26. ¿Cómo rastrear por categoría?
- 27. LINQ - Agregar propiedad a los resultados
- 28. iPhone: Categoría con propiedad + excepción "selector no reconocido enviado a la instancia"
- 29. Agregar nueva propiedad a la clase de cadena C#
- 30. BOOL a NSString
posible duplicado de [Objective-C: Propiedad en la categoría] (http: // stackoverflow.com/questions/8733104/objective-c-property-in-category) –
¡Publique el código para sus captadores y establecedores! – paulmelnikow