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

时间:2011-11-16 11:59:09

标签: ios mpmovieplayercontroller navigationcontroller unrecognized-selector

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

似乎一切都好,但是当我点击播放按钮时出现此错误:

 -[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.
        // e.g. 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方法的调用,但我无法找到解决方案!

P.S。
我不小心抹去了评论,我很抱歉! =(

1 个答案:

答案 0 :(得分:5)

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

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

[DetailsViewController playmovie];

[oneDetailsViewController playmovie];

而不是:

[oneDetailsViewController playmovie:nil];

此处oneDetailsViewControllerDetailsViewController*个对象。

修改

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