Как определить вид с тегом NSString? - PullRequest
4 голосов
/ 25 октября 2011

view.tag хранится только в NSInteger Value.

Итак, как идентифицировать каждое представление со значением NSString?

недоступно?

в некоторых примерах:

view0.stringTag = @"basic";

view1.stringTag = @"advanced";

Ответы [ 9 ]

15 голосов
/ 25 октября 2011

Нет свойства stringTag на UIView.Если вам нужно сделать что-то подобное, вы можете использовать категорию на UIView и сохранить тег в связанном объекте:

@interface UIView (StringTagAdditions)
@property (nonatomic, copy) NSString *stringTag;
@end

@implementation UIView (StringTagAdditions)
static NSString *kStringTagKey = @"StringTagKey";
- (NSString *)stringTag
{
    return objc_getAssociatedObject(self, kStringTagKey);
}
- (void)setStringTag:(NSString *)stringTag
{
    objc_setAssociatedObject(self, kStringTagKey, stringTag, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
7 голосов
/ 22 октября 2012
if use ARC

#import "UIView.h"
#import <objc/runtime.h>

@implementation UIView (StringTagAdditions)
static NSString *kStringTagKey = @"StringTagKey";
- (NSString *)stringTag
{
    return objc_getAssociatedObject(self, CFBridgingRetain(kStringTagKey));
}
- (void)setStringTag:(NSString *)stringTag
{
    objc_setAssociatedObject(self, CFBridgingRetain(kStringTagKey), stringTag, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

@end
5 голосов
/ 25 октября 2011

Нет, вы не можете использовать строку.Если вы стремитесь к читабельности кода, вы можете использовать enum.Обязательно начинайте перечисление с 1, так как 0 является тегом по умолчанию для всех представлений:

typedef enum {
    vtBasic = 1,
    vtAdvanced
} ViewType;
...
view0.tag = vtBasic;
1 голос
/ 18 февраля 2014

Использование restorationIdentifier.

// Supposing iOS 6.0+
view0.restorationIdentifier = @"basic";
view1.restorationIdentifier = @"advanced";
0 голосов
/ 16 февраля 2015

Самое простое решение на данный момент: Ссылка на мой ответ на похожий вопрос

Попробуйте установить свойство идентификатора доступности вашего UIView:

UIView *view;
view.accessibilityIdentifier = @"your string here";
NSLog(@"%@", view.accessibilityIdentifier);

Выход =>ваша строка здесь

Это ведет себя так же, как свойство "tag", но позволяет вам использовать NSString

0 голосов
/ 25 октября 2011

Если вы хотите сравнить NSStrings,

if([view0.stringTag isEqualToString:@"basic"]){
  // 
}

как

if(view0.tag==0){
//
} 

, где stringTag - это переменная NSString, которая должна быть определена в представлениях, и присвоенное значение для сравнения

0 голосов
/ 25 октября 2011

Во-первых, вы никогда не используете теги как есть. Всегда делайте это так, возможно, в файле .h (лучшая практика, ИМХО.):

#define MY_VIEW_A 10001
#define MY_VIEW_B 10002

Затем при создании представлений:

view0.tag = MY_VIEW_A
view1.tag = MY_VIEW_B

Тогда, где вы хотите найти представление:

UIView *viewA = [mainView viewWithTag:MY_VIEW_A]; //this will be the view0 you created.

Кроме того, вы можете определить хеш-функцию, которая преобразует NSString в некоторое целое число, которое может быть назначено как тег. Э.Г.

- (int) tagForName:(NSString*)name;

а затем также

- (NSString*) nameForTag:(int)tag;

Я оставляю на ваше усмотрение определить хеш-функцию .

0 голосов
/ 25 октября 2011

Это возможно только в том случае, если вы подклассифицируете свой собственный UIView со свойством stringTag. Какова ваша причина для этого?

0 голосов
/ 25 октября 2011

не поддерживается напрямую. Конечно, для этого можно создать массив C, NSArray, NSDictionary или что-то подобное (в сочетании с тегом int).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...