0

はい、これと重複した質問かもしれませ。しかし、答えが得られなかったので、ケースとコードについてより具体的に説明します。

私は3つ関与していUIViewControllersます:

  1. WelcomeView- 最初の1つ
  2. TakePhotoViewController- OverlayviewController のデリゲートである 2 番目の人
  3. OverlayViewController- カメラのカスタム ビュー。

シナリオ:

  1. ユーザーがWelcomeViewボタンを入力してクリックすると、セグエで転送されTakeViewます。
  2. UIImageViewController撮影のため開封中です。
  3. ユーザーがキャンセル ボタンをクリックすると、didCancelCameraメソッド inTakePhotoViewController が呼び出され、ユーザーはに戻ります。WelcomeView
  4. ユーザーがアプリを離れます。
  5. ユーザーがアプリを再度開き、手順 1 をもう一度実行します。

イメージ ピッカーが開かれていません。私は写真を撮ることができましたが、それは問題ありません - しかし、ユーザーは彼が撮っているものを見ることができません.

OverlayViewController.h

@interface OverlayViewController : BaseViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (nonatomic,weak) id<OverlayViewControllerDelegate> delegate;
@property (nonatomic,retain) UIImagePickerController *imagePickerController;
@end

OverlayViewController.m:


- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.imagePickerController = [[UIImagePickerController alloc] init];
        self.imagePickerController.delegate = self;
    }
    return self;
}


- (void)viewDidLoad
{   
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
}

- (IBAction)takePicture:(id)sender {
    [self.imagePickerController takePicture];
}

- (IBAction)cancelImagePicker:(id)sender {
    [self.delegate didCancelCamera];
}

- (void) setupImagePicker:(UIImagePickerControllerSourceType) sourceType
{
    self.imagePickerController.sourceType = sourceType;
    if (sourceType == UIImagePickerControllerSourceTypeCamera)
    {
        self.imagePickerController.showsCameraControls = NO;
        if ([[self.imagePickerController.cameraOverlayView subviews] count] ==0)
        {
            CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame;
            CGRect newFrame = CGRectMake(0.0, CGRectGetHeight(overlayViewFrame)-self.view.frame.size.height-10.0, CGRectGetWidth(overlayViewFrame), self.view.frame.size.height + 10.0);
            self.view.frame = newFrame;
            [self.imagePickerController.cameraOverlayView addSubview:self.view];
        }
    }
}


- (void)finishAndUpdate
{
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
    [self.delegate didFinishWithCamera];  // tell our delegate we are done with the camera
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [self finishAndUpdate];
}

TakePhotoViewController.h

@interface TakePhotoViewController : BaseViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,OverlayViewControllerDelegate>
@property (nonatomic, retain) OverlayViewController *overlayViewController;
@end

TakePhotoViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    // Insert the overlay
    self.overlayViewController = (OverlayViewController *)[sb instantiateViewControllerWithIdentifier:@"Overlay"];
    self.overlayViewController.delegate = self;   
}
- (void)viewDidUnload
{
    self.overlayViewController = nil;
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}
- (void)openImagePicker {
   if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
       [self showImagePicker:UIImagePickerControllerSourceTypeCamera];
   }
   else{
       [self showImagePicker:UIImagePickerControllerSourceTypePhotoLibrary];
   }
}

- (void)viewDidAppear:(BOOL)animated{
    if (appDelegate.shouldOpenPicker){
      [self openImagePicker];
    }
}
- (void)showImagePicker:(UIImagePickerControllerSourceType)sourceType
{

    if ([UIImagePickerController isSourceTypeAvailable:sourceType])
    {
       [self.overlayViewController setupImagePicker:sourceType];
       [self presentViewController:self.overlayViewController.imagePickerController animated:YES completion:nil];
    }
}
-(void)didCancelCamera{
    [[self.overlayViewController.imagePickerController presentingViewController] dismissViewControllerAnimated:NO completion:^ {
        [self performSegueWithIdentifier:@"fromTakeToWelcome" sender:self];
    }];

}
4

1 に答える 1

0

バグを見つけました。

方法

-(void)didCancelCameraユーザーがin をクリックするとfromTakePhotoViewControllerが呼び出されます。- (IBAction)cancelImagePicker:(id)senderOverlayViewController

ただし、どういうわけか、コードdidCancelCameraによってviewDidAppearのメソッドがTakePhotoViewController再度呼び出され、イメージ ピッカーが再び開かれます。

理由がわかりません

[[self.overlayViewController.imagePickerController presentingViewController] dismissViewControllerAnimated:NO completion:^ {
        [self performSegueWithIdentifier:@"fromTakeToWelcome" sender:self];
    }];

そのビュー (TakePhoto) の viewDidAppear メソッドが再度呼び出されます。

それが誰かを助けることを願っています

于 2013-01-02T09:57:27.080 に答える