Xcode - 如何解雇模态UIImageView?

时间:2014-08-17 05:52:30

标签: ios objective-c uiimageview

iOS开发很新。我正试图制作一个让我从照片库中选择照片并显示它的东西。我正在使用带导航控制器的故事板。我能够很好地选择和显示图像,但我无法弄清楚如何关闭图像视图并返回图像选择器。我只是得到一个全屏图像,无法点击任何地方做任何事情。代码如下所示:

snapViewController.h 

#import <UIKit/UIKit.h>

@interface snapViewController : UIViewController <UIImagePickerControllerDelegate,
UINavigationControllerDelegate> 

@property (strong, nonatomic) IBOutlet UIImageView *ImageView;

- (IBAction) done:(UIStoryboardSegue *)unwindsegue;

@end

我的.m

snapViewController.m 


#import "snapViewController.h"

@interface snapViewController ()

@end

@implementation snapViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (BOOL)prefersStatusBarHidden {
    return YES;
    [self setNeedsStatusBarAppearanceUpdate];
}


- (void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    if (self.ImageView.image == nil){
        UIImagePickerController * imagePickerController = [UIImagePickerController new];
        imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
        imagePickerController.delegate = self;
        [self presentViewController:imagePickerController animated:NO completion:nil];
    }
    else {

    }



}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    [self dismissViewControllerAnimated:YES completion:nil];

}

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
    self.ImageView.image = image;
    [self.ImageView setUserInteractionEnabled:YES];
    [self dismissViewControllerAnimated:YES completion:nil];


}

- (IBAction) done:(UIStoryboardSegue *)unwindsegue {


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

故事板看起来像这样,我在UIImageView底部插入了一个带有完成按钮的工具栏: storyboard 我是否需要将完成按钮绑定到[self dismissViewControllerAnimated:YES completion:nil];操作?我怎样才能做到这一点?我一直在努力解决这个问题几个小时,但无法理解。谢谢。

3 个答案:

答案 0 :(得分:1)

阅读一些关于视图和窗口以及查看控制器和内容的内容,想出了这个:

- (IBAction)kill:(id)sender {
    self.ImageView.image = nil;
    [self viewDidAppear:TRUE];
    [self dismissViewControllerAnimated:NO completion:nil];

}

我将完成按钮绑定到它,它看起来像是有效的。这似乎是可以接受的记忆(多次打开和关闭图像并没有使记忆增加超过原来的记忆)。如果这不是正确的方法,请告诉我。谢谢。

答案 1 :(得分:0)

与其他segue相比,模态segue非常特殊,因为当您关闭新视图控制器时,您将从旧视图调用方法。它的工作方式是这样的:

在旧视图控制器中,使用参数(UiStoryBoardSegue *)创建类型(IBAction *)的方法。例如:

-(IBAction*)done:(UIStoryBoardSegue*)segue{}

然后,在故事板中,从新视图控制器中的“完成”按钮控制 - 拖动到新视图控制器底部行中的绿色(最左侧)按钮(与完成相同的视图控制器)按钮),您在旧视图控制器中创建的方法将弹出,您需要选择它。

现在会发生的是,一旦按下完成按钮,模态将被解除并将在旧视图控制器上调用Done方法

答案 2 :(得分:0)

你的杀戮IBAction正处于正确的轨道上,但是那里有一些你不需要的东西。您不应该从某个操作中调用viewDidAppear。让操作系统管理对viewDidLoad,willAppear,didAppear等的所有调用。

如果要从显示中删除imageview的图像,则只需调用self.imageView.image = nil;即可。然后,您可以添加另一个按钮并将其连接到动作以打开图像选择器模式并选择不同的图像。

请记住,snapViewController不是模态,它只是导航堆栈中的根视图控制器,恰好有一个全屏图像。导航控制器是一个包含一堆视图控制器的组件 - 它本身永远不会显示给用户。也就是说,你不需要关闭snapViewController来重置图像,你应该只需要一个看似如下的完成或终止动作:

- (IBAction)kill:(id)sender {
    self.imageView.image = nil;
}