在UIImagePickerController委托中识别不同的选择器

我有一个带有几个按钮的视图,我用它来呈现UIImagePickerControllers(相机和媒体选择器)。 当我创建UIImagePickerControllers时,我给它们不同的名称,并在下面的代码中看到它们的模态:

- (void) startMediaBrowserFromViewControllerForBGImage { UIImagePickerController * mediaUIForBGImage = [[UIImagePickerController alloc]init]; //i also set a bunch of different settings here, but it doesn't matter for this purpose mediaUIForBGImage.delegate = self; [self presentModalViewController: mediaUIForBGImage animated:YES]; } 

现在您还可以在代码中看到,我将委托设置为self ,这就是我对所有UIImagePickerControllers所做的事情,但问题是 – 在委托方法中,我如何知道哪个UIImagePickerController称为委托方法。 因为我需要对媒体采取的操作对于每个UIImagePickerControllers是不同的。 在委托方法中,我确实获得了UIImagePickerController参数,但它始终具有从方法(选择器)分配的名称。 我可以用什么来知道要引用哪个UIImagePickerController?

我认为你可以存储对每个选择器的引用,然后检查它是否是同一个实例。 虽然我会质疑使用多个不同的选择器实例,你能配置一个吗? 此外,它们在任何配置中都返回相同的结果,您可以根据特定需求调查结果字典。

 self.oneImagePicker = [UIImagePickerController ...] self.twoImagePicker = [UIImagePickerController ...] //In delegate if ([self.oneImagePicker isEqual:picker]) ... 

一个解决方案可能是这样的:

如果设置各种选择器的“ tag ”值,发送给委托方法的其中一个参数将包括导致委托方法触发的选择器,如果你查看它的“ tag ”值,你将会知道它是哪个选择器。

另一种解决方案可能是将每个选择器设置为ivar或属性,然后比较发送给委托方法的选择器参数,以查看哪一个等于哪个ivar或属性(即对象的地址相同?)。

你可以锻炼你在委托中处理哪个选择器 – 例如检查标签属性 – 或者创建一个UIPopoverController子类来驱动你的popover并使它成为ImagePicker的委托。 它需要将所选信息传递回主类 – 您可以通过实现popoverControllerShouldDismissPopover委托方法并检查子类的属性来完成此操作