Ios 如何使用UIImagePicker生成条件语句来控制推送序列的发生?

Ios 如何使用UIImagePicker生成条件语句来控制推送序列的发生?,ios,objective-c,Ios,Objective C,我正在尝试处理这样一种情况:如果成功地从照片库加载了一个图像,那么就触发到另一个视图控制器的push segue,在该控制器中,图像将显示在图像视图中。如果没有加载图像,就说按下了取消按钮,然后不要触发push segue,而是停留在当前根视图上 这是一款适用于iPhone的应用程序 我目前拥有的功能不起作用,有时在访问照片库并选择图像/取消的过程中,我会收到此警告: 警告:当演示正在进行时,尝试在上演示 我的代码如下: ViewController.m #import "ViewControl

我正在尝试处理这样一种情况:如果成功地从照片库加载了一个图像,那么就触发到另一个视图控制器的push segue,在该控制器中,图像将显示在图像视图中。如果没有加载图像,就说按下了取消按钮,然后不要触发push segue,而是停留在当前根视图上

这是一款适用于iPhone的应用程序

我目前拥有的功能不起作用,有时在访问照片库并选择图像/取消的过程中,我会收到此警告:

警告:当演示正在进行时,尝试在上演示

我的代码如下:

ViewController.m

#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混淆。