2010-07-29 1 views
2
//adds a button to scroll list 
-(void) addNode:(NSString *) atitle{ 
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [btn setTitle:atitle forState:UIControlStateNormal]; 
    [btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; // handle touch 
    [buttons addObject:btn]; 
.... 
} 

//a data button was pressed 
-(void) buttonTouched:(id)sender{ 
    int index = [buttons indexOfObject:sender]; 
    NSString *key = [sender titleLabel].text; 
} 

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> 

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

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
[super viewDidLoad]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDidLoad" object:nil]; 
} 

-(void) awakeFromNib{ 
[self loadData]; // loads some data 
    //calls addNode for a bunch of dynamic data 
} 

Getting этой ошибке:EXC_BAD_ACCESS непризнанного селектора послал к экземпляру

2010-07-29 10:19:45.428 DataManager[2945:207] -[NSCFString buttonTouched:]: unrecognized selector sent to instance 0x593abb0 
2010-07-29 10:19:45.429 DataManager[2945:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString buttonTouched:]: unrecognized selector sent to instance 0x593abb0' 
*** Call stack at first throw: 
( 
0 CoreFoundation      0x02399919 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x024e75de objc_exception_throw + 47 
2 CoreFoundation      0x0239b42b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
3 CoreFoundation      0x0230b116 ___forwarding___ + 966 
4 CoreFoundation      0x0230acd2 _CF_forwarding_prep_0 + 50 
5 UIKit        0x002bde14 -[UIApplication sendAction:to:from:forEvent:] + 119 
6 UIKit        0x003476c8 -[UIControl sendAction:to:forEvent:] + 67 
7 UIKit        0x00349b4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527 
8 UIKit        0x003486f7 -[UIControl touchesEnded:withEvent:] + 458 
9 UIKit        0x00535070 _UIGestureRecognizerUpdateObserver + 3687 
10 CoreFoundation      0x0237ad1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
11 CoreFoundation      0x0230f987 __CFRunLoopDoObservers + 295 
12 CoreFoundation      0x022d8c17 __CFRunLoopRun + 1575 
13 CoreFoundation      0x022d8280 CFRunLoopRunSpecific + 208 
14 CoreFoundation      0x022d81a1 CFRunLoopRunInMode + 97 
15 GraphicsServices     0x02bfe2c8 GSEventRunModal + 217 
16 GraphicsServices     0x02bfe38d GSEventRun + 115 
17 UIKit        0x002cbb58 UIApplicationMain + 1160 
18 DataManager       0x00002940 main + 102 
19 DataManager       0x000028d1 start + 53 
) 
terminate called after throwing an instance of 'NSException' 
Program received signal: “SIGABRT”. 
kill 
kill 

The Debugger has exited due to signal 15 (SIGTERM).The Debugger has exited due to signal 15 (SIGTERM). 

ответ

0

Является buttons массив, который вы инициализированы (я предполагаю, так как вы используете addObject, который предназначен только для массивов)? Вы говорите, что он должен добавить его в список прокрутки (я предполагаю, что вы имели в виду scrollview), но ошибка, которую вы даете, кажется, что вы передаете ее в строковый объект.

Чтобы добавить Scrollview, вы могли бы сделать:

[someScrollview addSubview:btn]; 

Кроме того, я не вижу где-нибудь, что вы установили рамку объекта для того, когда он будет добавлен в Scrollview. Это то, что вам нужно будет сделать, прежде чем добавлять его в качестве подвью.

работает просто отлично для меня (обратите внимание, вы должны быть инициализации и высвобождая изменяемый массив где-то, я просто сделал это быстро):

Консоль вывода = 2010-07-29 15: 54: 54,563 Torch [52222 : 207] Да Привет и 0

код, который я использовал:

NSMutableArray *buttons; // in your .h interface 

@property (nonatomic, retain) NSMutableArray *buttons; // in your .h 

@synthesize buttons; // in your .m 

(...)

-(IBAction) pushMyButtons { 
buttons = [[NSMutableArray alloc] init]; 

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[btn setTitle:@"Hi" forState:UIControlStateNormal]; 
[btn setFrame:CGRectMake(65, 300, 200, 23)]; 
[btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; // handle touch 
[buttons addObject:btn]; 
[self.view addSubview:btn]; 
} 

//a data button was pressed 
-(void) buttonTouched:(id)sender{ 

int index = [buttons indexOfObject:sender]; 
NSString *key = [sender titleLabel].text; 
NSLog(@"Yep %@ and %d", key, index); 

} 
+0

Мой плохой. Я новичок. Да, массив кнопок инициализируется во время init. Да [scrollview addSubview: btn]. Проблема заключается в том, когда я нажимаю динамически добавленную кнопку. –

+0

Нет, просто пытаюсь получить как можно больше информации :) См. Мой обновленный пост, это работает отлично для меня .. Вместо того, чтобы добавлять его в scrollview, я просто добавил его в представление очень быстро, но нет никакой разницы в двух. Я сделал свою кнопку заголовок «Привет» – iwasrobbed

+0

Не работает по какой-то причине. Спасибо хоть. См. Ответ выше. –

1

Я добавил [self retain];, прежде чем добавлять действие к кнопке, и теперь это работает!

-(void) addNode:(NSString *) atitle{ 
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [btn setTitle:atitle forState:UIControlStateNormal]; 
    [self retain]; 
    [btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; // handle touch 

По какой причине?
сам является UIViewController, который обрабатывает все (по крайней мере, я думал)

+0

Вызов '[self сохраняется ';' открывает дверь для большой утечки памяти, так как вы нажимаете 'keepCount' контроллера вида на 1 и никогда не отпускаете объект снова. Это не имеет никакого отношения к созданию кнопки динамически. – iwasrobbed

+0

Рекомендации тогда? –

1

Если вы используете ARC компилируют и программную настройку селектора с помощью:

[_backButton addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside]; 

EXC_BAD_ACCESS происходит для меня, потому что я создал один из родителей а затем добавили subview в другое представление. Подвью (с кнопкой) имеет родительский релиз. Все выглядело отлично, пока не была выбрана кнопка, а затем авария.

Любые исключения с селекторами, скорее всего, являются проблемами выпуска класса. Retain не следует использовать в качестве работы (конечно, в компиляторах ARC, которые вы не можете использовать для сохранения). Код должен быть просмотрен для возможных овдовевших указателей в функции, которая освободит родителя объекта.

Надеюсь, что это поможет.