NSInvalidArgumentException "Unrecognized selector sent to instance" (using MPMoviePlayerController)

Well, I have a TableView in a RootViewController with a DetailViewController to display information about a single record. On the Details page, I need to play a multimedia file, and I use MediaPlayer in accordance with this guide: http://www.techotopia.com/index.php/Video_Playback_from_within_an_iOS_4_iPhone_Application

Everything seems to be fine, but when I press the play button, I have this error:

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

These are my files:

In AppDelegate, I use this navigation controller:

 [...] // 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]; 

and in the RootViewController . I use this instruction to go to the 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 

, and this is 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 

My question is: where is my mistake? I assume this is a call to the playmovie method, but I cannot figure out the solution!

PS
I accidentally deleted a comment, I'm so sorry! = (

+4
source share
1 answer

It seems you are calling playmovie on a class, not on an object, or you forget to specify a parameter. If you show us where you call it, this may help.

In any case, the problem is what you are probably doing:

 [DetailsViewController playmovie]; 

or

 [oneDetailsViewController playmovie]; 

instead:

 [oneDetailsViewController playmovie:nil]; 

Here oneDetailsViewController is a DetailsViewController* object.

EDIT

Delete the XIB link, save and add the IBAction link again by dragging it (right-click) from the button to the file owner.

+5
source

Source: https://habr.com/ru/post/1381473/


All Articles