Я хочу выполнять разные действия при нажатии на разные кнопки, созданные динамически

#iphone #objective-c

#iPhone #objective-c

Вопрос:

Кнопки создаются динамически, и изображения передаются им через проанализированные URL-адреса, поэтому я viewDidLoad я создал их и выпустил только в viewDidLoad. Итак, когда я нажимаю на кнопки, я хочу выполнять разные задачи при нажатии на разные кнопки. но я не могу этого сделать. Я попытался установить для них тег, но опять же это бесполезно, так как это дает мне EXC_BD_ACCESS …. любая помощь будет оценена … 🙂 Код:-

 @class AppDelegate_iPhone,Litofinter,ParsingViewController;

@interface FirstViewController : UIViewController<UIGestureRecognizerDelegate>{

    NSMutableArray *array;
    NSString *logoString;
    AppDelegate_iPhone *appDelegate;

    ParsingViewController *obj;

    UIScrollView *scrollView;

    NSMutableArray *idArray;
    NSMutableArray * currentPdfUrl;



}
@property (nonatomic,retain)UIScrollView *scrollView;

//-(void)onTapImage:(UITapGestureRecognizer *)recognizer;
-(void)onTapButton:(id)sender;

@end



#import "FirstViewController.h"
#import "AppDelegate_iPhone.h"
#import "Litofinter.h"
#import "ParsingViewController.h"
#import "MyGesture.h"

@implementation FirstViewController

@synthesize scrollView;

-(id)init{
    if(self == [super init]){
        obj = [[ParsingViewController alloc] init];
        array = [[NSArray alloc] initWithArray: obj.LogoMutableArray];
    }
    return self; 
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    int x=20,y=10;
    int a=50,b=105;


    appDelegate = (AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate];

    scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0,500, 460)];   
    scrollView.contentSize = CGSizeMake(320,800);
    scrollView.showsVerticalScrollIndicator = YES;

    for (Litofinter *lito in appDelegate.logoArray) {

        NSString * urlString = [lito.cLogo stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
        NSURL * imageURL = [NSURL URLWithString:urlString];

        NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
        UIImage * image = [UIImage imageWithData:imageData];
/*              
        UIImageView *imgView = [[UIImageView alloc] initWithImage:image];
        [imgView setFrame:CGRectMake(x, y, 140, 90)];
        imgView.userInteractionEnabled = YES;
        imgView.multipleTouchEnabled = YES;
        imgView.backgroundColor = [UIColor blueColor];
    //  imgView.tag = lito.cId;
    //  NSLog(@"Tag Id = %@",imgView.tag);
        NSLog(@"Tag Id = %@",lito.cId);


        UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapImage:)];
        tgr.delegate = self;
        [imgView addGestureRecognizer:tgr];

        [scrollView addSubview:imgView];

        tgr.view.tag =(int)[NSString stringWithFormat:@"%@",lito.cId];
        NSLog(@"Tag Id = %@",tgr.view.tag);
    //  NSLog(@"Tag Id = %@",lito.cId);

*/      


        UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [imageButton setFrame:CGRectMake(x, y, 140, 90)];
        [imageButton setImage:image forState:UIControlStateNormal];
        [imageButton addTarget:self action:@selector(onTapButton:) forControlEvents:UIControlEventTouchUpInside];
        [imageButton setTag:lito.cId];
        [scrollView addSubview:imageButton];


        UILabel *cName = [[UILabel alloc]initWithFrame:CGRectMake(a, b, 130, 20)];
        cName.text = lito.cName;
        [scrollView addSubview:cName];

        //Do the rest of your operations here, don't forget to release the UIImageView
        x = x   150;
        a = a   140;

        if(x >300)
        {
            y = y  140;
            x = 20;
            b = b  150;
            a = 50;
        }

        //[tgr release];
    //  [imgView release];

    }
    [self.view addSubview:scrollView];


}

-(void)onTapButton:(id)sender
{
    NSLog(@"Tag Id = %@",self.view.tag);

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Message from mAc" message:@"Tag Id" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok",nil];
    [alert show];

}
  

Ответ №1:

Вы можете изменить селектор в зависимости от кнопки при установке цели

 [imageButton addTarget:self action:@selector(onTapButton:) forControlEvents:UIControlEventTouchUpInside];
  

Если вы хотите сделать это с помощью тегов, это также может сработать, ваш плохой доступ поступает из

 NSLog(@"Tag Id = %@",self.view.tag);
  

Предполагается, что тег является NSObject (отвечает на селектор описания), когда на самом деле это числовое значение. Измените его на:

 NSLog(@"Tag Id = %i",self.view.tag);
  

Кроме того, вы хотите быть осторожными при использовании

 NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
  

поскольку это синхронный API, это нормально, если это локальные файлы (хотя использование [UIImage imageNamed:] более экономично, поскольку оно кэширует данные изображения), это действительно плохо, если это сетевые файлы (поскольку это блокирует поток до завершения запроса, что может занять годы).

Комментарии:

1. Спасибо jbat100…. но если я напишу NSLog (@»Идентификатор тега = %i», self.view.tag); тогда также не придет мой идентификатор, который я установил

2. Вы должны получить тег от отправителя (который будет кнопкой) NSLog (@»Идентификатор тега = %i»,[(UIButton *) тег отправителя]);

3. Идентификатор, который я установил, и идентификатор, который я получаю, не совпадают с идентификатором, который я устанавливаю, который я получаю из проанализированного XML, и я получаю идентификатор из 8-9 цифр …. который я что-то еще…

4. Какой длины ваш XML id? Максимальное значение NSInteger — это NSIntegerMax, определенное как LONG_MAX (2147483647), ваш идентификатор больше этого?

5. Мой идентификатор 2,20,21,22, но они выглядят следующим образом Идентификатор тега = 79303232 Идентификатор тега = 79299904 Идентификатор тега = 78755760 Идентификатор тега = 81872640