2013-09-09 1 views
1

Я создаю несколько экземпляров UILabel для отображения на карте, которая будет иметь много ярлыков и позволит пользователю вернуть номер или номер тега выбранного. В приведенном ниже коде возвращается только последний созданный экземпляр, вероятно, из-за той же переменной «newCity».Несколько экземпляров UILabel

В двух экземплярах будут динамически заполняться данные из pList, которые я прокручу, чтобы получить город, idNumber и x & y размещение метки. Количество городов будет отличаться каждый раз и может даже динамически меняться. Для ясности показаны два.

Вопрос в том, как получить правильный идентификатор для правильной метки, на которую постукивается? Я искал много мест, но не нашел решений, которые работают без каких-либо других проблем. Как создать новые экземпляры и получить правильный результат?

Также обратите внимание, что в названии tapGestureRecognizer внизу есть tapGesture и tapGesture2. Он не работает с одним и тем же. Как я могу использовать tapGesture с одним именем и распознавать метку?

Я бы предпочел использовать надписи, кроме кнопок, если нет другого пути. Я даже могу добавить touchBegan или touchhesMoved, чтобы настроить subView, что я не хочу конфликтовать с tapGesture в ярлыке.

Я ценю вашу помощь.

WBCitiesView.h

@interface WBCitiesView : UIViewController 
{ 
    UIView  *subView; 
    int   resultNumber; 
} 

@property(nonatomic, strong) UIView *subView; 
@property int resultNumber; 

- (void) touchUp:(id)sender; 

@end 

WBCitiesView.m

#import "WBCitiesView.h" 
#import "WBCities.h" 


@interface WBCitiesView() 

@end 

@implementation WBCitiesView 

@synthesize subView, resultNumber; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 

    } 
    return self; 
} 


WBCities *newCity; 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CGRect mapFrame = CGRectMake(20, 30, 250, 300); 
    subView = [[UIView alloc]initWithFrame:mapFrame]; 
    subView.backgroundColor = [UIColor grayColor]; 
    subView.alpha = .5; 
    subView.autoresizesSubviews=YES; 
    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:subView action:@selector(swipe:)];///was self 
    [subView addGestureRecognizer:swipe]; 
    [self.view addSubview:subView]; 




    newCity =[[WBCities alloc] initWithFrame:CGRectMake(50, 20, 100, 30)]; 
    newCity.city = @"CityA"; 
    newCity.idNumber = 1111; 
    newCity.size = 0; 
    [newCity setBackgroundColor:[UIColor blueColor]]; 
    [newCity setText:newCity.city]; 
    [newCity setTag:newCity.idNumber]; 
    newCity.userInteractionEnabled = YES; 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchUp:)]; 
    [newCity addGestureRecognizer:tapGesture]; 
    [subView addSubview:newCity]; 


    newCity =[[WBCities alloc] initWithFrame:CGRectMake(100, 70, 100, 30)]; 
    newCity.city = @"CityB"; 
    newCity.idNumber = 2222; 
    newCity.size = 1; 
    [newCity setBackgroundColor:[UIColor yellowColor]]; 
    [newCity setText:newCity.city]; 
    [newCity setTag:newCity.idNumber]; 
    newCity.userInteractionEnabled = YES; 
    UITapGestureRecognizer *tapGesture2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchUp:)]; 
    [newCity addGestureRecognizer:tapGesture2]; 
    [subView addSubview:newCity]; 



-(void) touchUp:(id)sender 
{ 

    resultNumber = [newCity returnIdNumber]; 
} 

WBCities.h

@interface WBCities : UILabel{ 
    NSString *city; 
    int   idNumber; 
    BOOL  size; 
} 

@property (nonatomic, strong) NSString *city; 
@property (nonatomic) int idNumber; 
@property (nonatomic) BOOL size; 

-(int)returnIdNumber; 

@end 

WBCities.m

#import "WBCities.h" 
#import "WBCitiesView.h" 

@implementation WBCities 

@synthesize city, idNumber, size; 

-(id)init{ 
    self = [super init]; 
    if (self){ 

    } 
    return self; 
} 

-(int)returnIdNumber{ 

    return idNumber; 
} 

@end 

ответ

1

заменить -(void) touchUp:(id)sender метод с ниже кодом

-(void) touchUp:(id)sender 
{ 
    UITapGestureRecognizer *tapGesture = (UITapGestureRecognizer*)sender; 
    WBCities *cityLabel = (WBCities*)tapGesture.view; 
    resultNumber = [cityLabel returnIdNumber]; 
} 
+0

, пожалуйста, также повысьте свой ответ спасибо :) – abhishekkharwar

0

Чтобы получить правильный IDNumber вы должны сделать что-то вроде этого:

-(void) touchUp:(id)sender 
{ 
    WBCities* city =(WBCities*) sender; 

    resultNumber = [city tag]; 
} 

Использование IDNumber фактически лишними вы должны использовать тег поле вместо.

Чтобы избежать необходимости создания другого жеста распознавателя для каждого WBCity я предлагаю меняющийся WBCities расширить UIControl вместо UILabel, а затем инициализировать его следующим образом:

newCity =[[WBCities alloc] initWithFrame:CGRectMake(50, 20, 100, 30)]; 
    newCity.city = @"CityA"; 
    newCity.tag = 1111; 
    newCity.size = 0; 
    [newCity setBackgroundColor:[UIColor blueColor]]; 
    [newCity setCity:newCity.city]; 
    [newCity addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; 
    [subView addSubview:newCity]; 
+0

- (недействительными) TouchUp: (ID) отправитель { WBCities * cityLabel = (WBCities *) sender.view resultNumber = [newCity returnIdNumber]; } – abhishekkharwar

+0

Это сработало, однако при подклассе из UIControl он не смог использовать метод setText. Я попытался обойти это, но не смог этого сделать, по-видимому, это доступно в UILabel. Я смог использовать этот ответ в моем вызываемом методе, UITapGestureRecognizer * tapGesture = (UITapGestureRecognizer *) отправитель; WBCities * cityLabel = (WBCities *) tapGesture.view; resultNumber = [cityLabel returnIdNumber]; Благодарю. –

+0

Используйте setCity вместо setText. – null

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

  • Нет связанных вопросов^_^