当我在self.parentViewController中调用方法时,为什么我的应用程序崩溃了?

时间:2011-04-22 22:13:22

标签: iphone objective-c ios ios4

在我的代码中,我正在执行以下操作:

-(void)pushCropImageViewControllerWithDictionary:(NSDictionary *)dictionary {
civc = [[CropImageViewController alloc] init];
[self presentModalViewController:civc animated:YES];
civc.myImage.image = [dictionary objectForKey:UIImagePickerControllerOriginalImage];

}

所以我的应用程序中有一个模态视图。当这个模态视图解散时,我想从父视图(调用pushCropImageViewControllerWithDictionary的视图)调用一个方法,如下所示:

-(void)viewWillDisappear:(BOOL)animated {
[super viewWillAppear:animated];
[(AddNewItemViewController *)self.parentViewController addCroppedPicture:screenshot];

}

但它继续崩溃,并显示以下消息:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [UITabBarController addCroppedPicture:]:无法识别的选择器发送到实例0x4d15930'

有人能告诉我我做错了什么吗?我包含AddNewItemViewController的标头,因此应该识别选择器。有人可以帮我说明我该如何正确地做到这一点?感谢。

编辑:addCroppedPicture声明:

-(void)addCroppedPicture:(UIImage *)image;

到目前为止,实现本身是空的。

1 个答案:

答案 0 :(得分:2)

显然,self.parentViewController不是AddNewItemViewController的实例,而是标签栏控制器。因此崩溃。

正确的解决方案是成为代表:

-(void)pushCropImageViewControllerWithDictionary:(NSDictionary *)dictionary
{
    civc = [[CropImageViewController alloc] init];
    civc.delegate = self;
    [self presentModalViewController:civc animated:YES];
    ...
}

将消息发送回代理人:

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.delegate addCroppedPicture:screenshot];
}

由您来声明委托协议:

@protocol CropImageDelegate <NSObject>
- (void)addCroppedPicture:(UIImage*)image;
@end

并将代理人的属性添加到CropImageViewController

@property (nonatomic, assign) id<CropImageDelegate> delegate;

最后,让您的视图控制器符合此委托协议。