Ios 如何使用UIImagePicker生成条件语句来控制推送序列的发生?
我正在尝试处理这样一种情况:如果成功地从照片库加载了一个图像,那么就触发到另一个视图控制器的push segue,在该控制器中,图像将显示在图像视图中。如果没有加载图像,就说按下了取消按钮,然后不要触发push segue,而是停留在当前根视图上 这是一款适用于iPhone的应用程序 我目前拥有的功能不起作用,有时在访问照片库并选择图像/取消的过程中,我会收到此警告: 警告:当演示正在进行时,尝试在Ios 如何使用UIImagePicker生成条件语句来控制推送序列的发生?,ios,objective-c,Ios,Objective C,我正在尝试处理这样一种情况:如果成功地从照片库加载了一个图像,那么就触发到另一个视图控制器的push segue,在该控制器中,图像将显示在图像视图中。如果没有加载图像,就说按下了取消按钮,然后不要触发push segue,而是停留在当前根视图上 这是一款适用于iPhone的应用程序 我目前拥有的功能不起作用,有时在访问照片库并选择图像/取消的过程中,我会收到此警告: 警告:当演示正在进行时,尝试在上演示 我的代码如下: ViewController.m #import "ViewControl
#import "ViewController.h"
#import "selectDisplayViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (IBAction)LibraryButton:(id)sender
{
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:imagePicker animated:YES completion:nil];
}
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
/*UIImage *loadImage;
loadImage = [info valueForKey:UIImagePickerControllerOriginalImage];
buffer = loadImage;*/
modBuffer = nil;
modBuffer = [info valueForKey:UIImagePickerControllerOriginalImage];
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
CGImageRef cgImRef = [modBuffer CGImage];
CIImage *cIm = [modBuffer CIImage];
if(cIm != nil && cgImRef != NULL)
{
return true;
buffer = modBuffer;
}
return false;
}
- (void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:nil];
selectDisplayViewController *secondVC = [[selectDisplayViewController alloc]init];
[self presentViewController:secondVC animated:YES completion:nil];
}
- (void)viewDidLoad
{
imagePicker = [[UIImagePickerController alloc]init];
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
#import "selectDisplayViewController.h"
@interface selectDisplayViewController ()
@end
@implementation selectDisplayViewController
@synthesize selectDisplayView;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
selectDisplayView.image = buffer;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
UIImagePickerController *imagePicker;
UIImage *modBuffer;
}
- (IBAction)LibraryButton:(id)sender;
@end
#import <UIKit/UIKit.h>
@interface selectDisplayViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIImageView *selectDisplayView;
@end
UIImage *buffer;
选择DisplayViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
UIImagePickerController *imagePicker;
UIImage *modBuffer;
}
- (IBAction)LibraryButton:(id)sender;
@end
#import <UIKit/UIKit.h>
@interface selectDisplayViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIImageView *selectDisplayView;
@end
UIImage *buffer;
我所能做的就是加载图像。它不会转到“显示视图”控制器
非常感谢您的帮助或建议。您的代码的问题就在这里:
if(cIm != nil && cgImRef != NULL)
{
return true;
buffer = modBuffer;
}
在实际设置图像之前,返回true并启动segue。您的代码实际上应该如下所示:
if(cIm != nil && cgImRef != NULL)
{
buffer = modBuffer;
return true;
}
更新:为了让代码按您希望的方式工作,您需要对ViewController.m进行更新,然后选择DisplayViewController。我将在下面详细介绍它们
// Add to SelectDisplayViewController.m
// It is in this method that you should set UIImageViews, not viewDidLoad.
- (void)viewWillAppear:(BOOL)animated
{
[selectDisplayView setImage:buffer];
}
// Add to ViewController.m
// This method is called right before segue, so values for next view should be set here.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
buffer = modBuffer;
}
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
/*UIImage *loadImage;
loadImage = [info valueForKey:UIImagePickerControllerOriginalImage];
buffer = loadImage;*/
modBuffer = nil;
modBuffer = [info valueForKey:UIImagePickerControllerOriginalImage];
if (modBuffer) {
[picker dismissViewControllerAnimated:YES completion:nil];
// The value firstsegue is how your segue is recognized in code,
// it is set in storyboard. The following images attached illustrate this.
[self performSegueWithIdentifier:@"firstsegue" sender:nil];
} else {
// Figure out why modBuffer is not true
}
}
另请参阅ImagePickerController中的代码IDCancel。我犯了一个令人尴尬的错误!我解决了这个问题,但仍然没有解决问题。我仍然无法让它正常工作。如何声明缓冲区?另外,selectDisplayViewController对象在哪里?需要做一个吗?更具体地说。。。我发现libc++abi.dylib中的此错误:以NSException类型的未捕获异常终止来自[self-PerformsgueWithIdentifier:@displaySegue sender:nil];我知道标识符文本是正确的。缓冲区在SelectDisplayViewController中声明,就像您在SelectDisplayViewController.h中声明的一样。您不必担心在ViewController.m中设置缓冲区。请注意,我没有更改您的任何代码,我只是添加了我详细介绍的内容。出现该错误的原因是您没有将您的segue标识符显示为segue。如果您向上滚动到blibc++abi.dylib:终止类型为NSException的未捕获异常之前,您将看到标识符为“displaySegue”的无序列。在情节提要中,请记住,您必须在左面板视图中按住ctrl键并单击viewcontroller,将显示一个黑色对话框,顶部将触发序列。在本节“触发的分段”下,您将从手动拖动到要分段的viewController(在本例中选择DisplayViewController)。在故事板中,序列将由一个箭头表示,箭头从ViewController指向中的SelectViewController。单击该选项,然后在最右侧的面板中,选择“属性检查器”。您将在那里设置segue标识符。不要与情节提要id混淆。