1

私は比較的新しい iPhone 開発者で、2 番目の iPhone アプリの構築を大きく進めています。私が現在構築しているアプリでは、コード全体のさまざまな場所でコードの一部を再利用できるように、いくつかのプロトコルとデリゲートを使用してコードを分離しています。

これが私がしたいことです:

  1. CITRootViewController は CITReportCreator クラスのインスタンスを作成し、それ自体をプロパティとして渡します。これにより、reportCreator は追加のビュー コントローラーなどを開くことができます。
  2. CITReportCreator クラスは、CITImageCaptureViewController ファイルで宣言されている CITImageCaptureDelegate プロトコルを実装するものとして宣言されています。
  3. CITImageCaptureViewController はデリゲート プロトコルを定義し、CITReportCreator がそのデータとやり取りしたり、関連する XIB を閉じたりできるように、データと参照を子ビュー コントローラーに返すメソッドを持っています。

デリゲートとプロトコルが正しく確立されていると信じており、「デリゲート」オブジェクトが呼び出されたときにまだデータが含まれていることを確認しましたが、ビューコントローラーがデータをデリゲートに戻そうとすると EXC_BAD_ACCESS メソッドを取得していますこのコード行:

   [self.delegate childViewControllerDidFinish:self];

これが私のコードの残りの部分です。CITReportCreator クラスの代わりに CITRootViewController をデリゲートとして使用してこれを機能させましたが、コードを分離しているため、何かが壊れています。

CITReootViewController.m (Report Creator を呼び出すビュー コントローラー)

//create a nrew report
-(IBAction)createReport:(id)sender {
    CITReportCreator *report = [CITReportCreator alloc];
    [report createNewReport:self];
}

CITReportCreator.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "CITImageCaptureViewController.h"

@interface CITReportCreator : NSObject <CITImageCaptureDelegate>

@property (strong, nonatomic) NSArray *imageList;
@property (nonatomic) NSInteger imageIndex;


-(int) createNewReport:(UIViewController *)parent ;

//Delegate Methods
-(void) childViewControllerDidFinish:(UIViewController*)viewController;
@end

そして CITReportCreator.m

#import "CITReportCreator.h"

@implementation CITReportCreator
{
    UIViewController *parentController;
}

@synthesize  imageList;
@synthesize imageIndex;

-(int) createNewReport:(UIViewController *)parent
{

//store a reference to the parent view controller
parentController = parent;

// init code....

//head to the first image capture view
[self  startImageCapture];
return 0;
}  

-(int)startImageCapture
{
//pull the image name from the array of images
NSString *imageName = [imageList objectAtIndex:imageIndex];

//prep the image capture controller
CITImageCaptureViewController *capture = [[CITImageCaptureViewController alloc] initWithNibName:@"CITImageCaptureViewController" bundle:nil];

//Assign the capture controller's delegate
capture.imageName = imageName;
capture.delegate = self;

//Display the capture controller
[parentController presentModalViewController:capture animated:YES];

return 0;
}


//a break point set here never gets hit.
-(void) childViewControllerDidFinish:(UIViewController*)viewController;
{
[viewController dismissModalViewControllerAnimated:YES]; 
}

@end

最後に、CITImageCaptureViewControllers

CITImageCaptureViewController.h

#import <UIKit/UIKit.h>
@protocol CITImageCaptureDelegate <NSObject>
-(void) childViewControllerDidFinish:(UIViewController*)viewController;
@end


@interface CITImageCaptureViewController : UIViewController 
{
id<CITImageCaptureDelegate> delegate;
}

@property (nonatomic,assign) id<CITImageCaptureDelegate> delegate;
@property (nonatomic, assign) NSString *imageName;

//continue button pressed method
-(IBAction)continueButtonPressed:(id)sender;

@end

そして.mファイル

#import "CITImageCaptureViewController.h"

@interface CITImageCaptureViewController ()
@end

@implementation CITImageCaptureViewController
@synthesize navItem;

@synthesize  imageName;
@synthesize  delegate = _delegate; //i think this may be part of the problem

//cutting out initWithNibName, viewDidLoad, etc...



- (IBAction)continueButtonPressed:(id)sender
{
[self.delegate childViewControllerDidFinish:self];
} 
@end

デリゲートとプロトコルがそれほど単純だとは思いませんが、どこかに小さな変更が欠けていると思います。正しい方向に進むのを手伝ってもらえますか?

4

0 に答える 0