UIButton в UITabBarController падает при нажатии! - PullRequest
1 голос
/ 23 августа 2010

Я попытался программно включить пользовательскую кнопку в UIView, который является подпредставлением UITabBarController. Кнопка отображается нормально, но когда я нажимаю на нее, она вылетает без сообщения об ошибке. Странно, что иногда это противоречиво:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString playButton]: unrecognized selector sent to instance 0x632cd10'

Я даже пытался удалить любой код в моем методе кнопки воспроизведения, я попытался изменить имя playButton на playAction, я также попытался добавить кнопку непосредственно в «self», а не в aboutView, но результат все тот же.

Полагаю, это как-то связано с TabBar с UIView в качестве подпредставления с кнопкой на нем. Я не знаю.

Вот фрагмент кода того, как я построил tabBar в моем методе appDelegate



// About Tab
 aboutViewC = [[[AboutViewController alloc] init] autorelease];
 aboutNavC = [[[UIViewController alloc] init] autorelease];
 aboutNavC.title = @"About";
 aboutNavC.view = aboutViewC.view;

 // Lessons Tab
 lessonsViewC = [[[LevelViewController alloc] init] autorelease];
 lessonsViewC.title = @"Levels";
 lessonsNavC = [[[UINavigationController alloc] initWithRootViewController:lessonsViewC] autorelease];
 lessonsNavC.title = @"Lessons";
 lessonsNavC.viewControllers = [NSArray arrayWithObjects:lessonsViewC, nil];

 tabBarController = [[UITabBarController alloc] init];
 tabBarController.viewControllers = [NSArray arrayWithObjects:aboutNavC, lessonsNavC, nil];

и вот код для реализации класса AboutViewController

AboutViewController.h



#import 
@interface AboutViewController : UIViewController {
 UIButton *playSoundButton;
 UIView *aboutView;
}
- (void)playButton;
@end

AboutViewController.m


#import "AboutViewController.h"

@implementation AboutViewController

- (void)dealloc {
    [playSoundButton release];
    [aboutView release];
    [super dealloc];
}

- (void)viewDidLoad {
 aboutView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

 [playSoundButton = [UIButton buttonWithType:UIButtonTypeCustom] retain];
 image = [UIImage imageNamed:@"bt_play.png"];
 [playSoundButton setImage:image forState:UIControlStateNormal];
 [playSoundButton addTarget:self action:@selector(playButton) forControlEvents:UIControlEventTouchUpInside];
 playSoundButton.frame = CGRectMake(0, 350, 40, 40);
 [aboutView addSubview:playSoundButton];

 stopSoundButton.hidden = YES;
 playSoundButton.hidden = NO;

 [self.view addSubview:aboutView];

 [super viewDidLoad];
}

- (void)playButton
{
 NSLog(@"playAction method");
}
@end

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 августа 2010

Спасибо Тобу за отзыв, я действительно знаю, как реализовать оператор retain, это была опечатка, которую я не заметил. Удивительно, но это не проблема, и теперь код работает нормально, оставляя опечатку без изменений.

Настоящая проблема была в моем методе appDelegate. Вместо // About Tab <strong>aboutViewC = [[[AboutViewController alloc] init] autorelease]; aboutNavC = [[[UIViewController alloc] init] autorelease]; aboutNavC.title = @"About"; aboutNavC.view = aboutViewC.view;</strong> // Lessons Tab lessonsViewC = [[[LevelViewController alloc] init] autorelease]; lessonsViewC.title = @"Levels"; lessonsNavC = [[[UINavigationController alloc] initWithRootViewController:lessonsViewC] autorelease]; lessonsNavC.title = @"Lessons"; lessonsNavC.viewControllers = [NSArray arrayWithObjects:lessonsViewC, nil]; tabBarController = [[UITabBarController alloc] init]; <strong>tabBarController.viewControllers = [NSArray arrayWithObjects:aboutNavC, lessonsNavC, nil];</strong> должно быть // About Tab <strong>aboutViewC = [[[AboutViewController alloc] init] autorelease];</strong> <strong>aboutViewC.title = @"About";</strong> // Lessons Tab lessonsViewC = [[[LevelViewController alloc] init] autorelease]; lessonsViewC.title = @"Levels"; lessonsNavC = [[[UINavigationController alloc] initWithRootViewController:lessonsViewC] autorelease]; lessonsNavC.title = @"Lessons"; lessonsNavC.viewControllers = [NSArray arrayWithObjects:lessonsViewC, nil]; tabBarController = [[UITabBarController alloc] init]; <strong>tabBarController.viewControllers = [NSArray arrayWithObjects:aboutViewC, lessonsNavC, nil];</strong>

0 голосов
/ 23 августа 2010

[playSoundButton = [UIButton buttonWithType:UIButtonTypeCustom] retain]; следует читать playSoundButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];

(т.е. переместите первый [ дальше вправо к UIButton)

...