NSInvalidArgumentException“无法识别的select器发送到实例”(使用MPMoviePlayerController)

那么,我有一个具有DetailViewController的RootViewController中的TableView,用于显示单个logging的信息。 在详细信息页面我必须播放一个多媒体文件,并使用框架MediaPlayer,根据本指南: http : //www.techotopia.com/index.php/Video_Playback_from_within_an_iOS_4_iPhone_Application

似乎一切都好,但是当我点击播放button时,我有这个错误:

-[DetailsViewController playmovie]: unrecognized selector sent to instance 0x9117f60 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DetailsViewController playmovie]: unrecognized selector sent to instance 0x9117f60' 

这些是我的文件:

在AppDelegate中,我使用这个导航控制器:

 [...] // Create a table view controller RootViewController *rootViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain]; rootViewController.managedObjectContext = context; rootViewController.entityName = @"Porti"; UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; self.navigationController = aNavigationController; UIBarButtonItem *homeButton; homeButton = [[[UIBarButtonItem alloc] initWithTitle:@" Inizio " style:UIBarButtonItemStyleBordered target:self action:@selector(home)] autorelease]; UIBarButtonItem *barButton; barButton = [[[UIBarButtonItem alloc] initWithTitle:@" Mappa dei porti " style:UIBarButtonItemStyleBordered target:self action:@selector(caricamappa)] autorelease]; [toolbar setItems:[NSArray arrayWithObjects: homeButton, barButton, nil]]; [window addSubview:[navigationController view]]; [window addSubview:toolbar]; [window makeKeyAndVisible]; [rootViewController release]; [aNavigationController release]; 

在RootViewController中我使用这个指令传递给DetailViewController:

 //Push the new table view on the stack [self.navigationController pushViewController:detailsView animated:YES]; [detailsView release]; 

DetailsViewController.h

 #import <UIKit/UIKit.h> #import <MessageUI/MessageUI.h> #import "MLUtils.h" #import <MediaPlayer/MediaPlayer.h> @interface DetailsViewController : UIViewController { IBOutlet UILabel *titleLabel; IBOutlet UILabel *descriptionLabel; IBOutlet UIScrollView *descriptionScrollView; NSString *cityName; NSString *nomefile; NSString *extfile; NSString *description; } @property (nonatomic, retain) UILabel *titleLabel; @property (nonatomic, retain) UILabel *descriptionLabel; @property (nonatomic, retain) UIScrollView *descriptionScrollView; @property (nonatomic, retain) NSString *cityName; @property (nonatomic, retain) NSString *description; @property (nonatomic, retain) NSString *nomefile; @property (nonatomic, retain) NSString *extfile; - (IBAction)playmovie:(id)sender; @end 

这是DetailsViewController.m

  #import "DetailsViewController.h" @implementation DetailsViewController @synthesize titleLabel, descriptionLabel, descriptionScrollView; @synthesize cityName,description,nomefile, extfile; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; [self.titleLabel setText:self.title]; [self.descriptionLabel setText:self.description]; float textHeight = [MLUtils calculateHeightOfTextFromWidth:self.description : descriptionLabel.font :descriptionLabel.frame.size.width :UILineBreakModeWordWrap]; CGRect frame = descriptionLabel.frame; frame.size.height = textHeight; descriptionLabel.frame = frame; CGSize contentSize = descriptionScrollView.contentSize; contentSize.height = textHeight; descriptionScrollView.contentSize = contentSize; } -(void)playmovie:(id)sender { NSString *appNomeFile = self.nomefile; NSString *appExtFile = self.extfile; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:appNomeFile ofType:appExtFile]]; MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; moviePlayer.controlStyle = MPMovieControlStyleDefault; moviePlayer.shouldAutoplay = YES; [self.view addSubview:moviePlayer.view]; [moviePlayer setFullscreen:YES animated:YES]; } - (void) moviePlayBackDidFinish:(NSNotification*)notification { MPMoviePlayerController *moviePlayer = [notification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) { [moviePlayer.view removeFromSuperview]; } [moviePlayer release]; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // eg self.myOutlet = nil; } // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations //return (interfaceOrientation == UIInterfaceOrientationPortrait); return YES; } - (void)dealloc { [titleLabel release]; [descriptionLabel release];[descriptionScrollView release]; [cityName release]; [description release]; [nomefile release]; [extfile release]; [super dealloc]; } @end 

我的问题是:我的错误在哪里? 我想这是在playmovie方法的调用,但我无法弄清楚一个解决scheme!

PS
我不小心擦掉了一个评论,我很抱歉! =(

你似乎在课堂上而不是在一个对象上调用playmovie ,或者你忘了给这个参数。 如果你告诉我们你在哪里打电话,这可能会有所帮助。

无论如何,问题是,你可能会这样做:

 [DetailsViewController playmovie]; 

要么

 [oneDetailsViewController playmovie]; 

代替 :

 [oneDetailsViewController playmovie:nil]; 

这里的一个DetailsViewController*是一个DetailsViewController*对象。

编辑

删除你的XIB链接,保存,并通过拖动(右键单击)button到文件的所有者再次链接到IBAction。