私は比較的新しい iPhone 開発者で、2 番目の iPhone アプリの構築を大きく進めています。私が現在構築しているアプリでは、コード全体のさまざまな場所でコードの一部を再利用できるように、いくつかのプロトコルとデリゲートを使用してコードを分離しています。
これが私がしたいことです:
- CITRootViewController は CITReportCreator クラスのインスタンスを作成し、それ自体をプロパティとして渡します。これにより、reportCreator は追加のビュー コントローラーなどを開くことができます。
- CITReportCreator クラスは、CITImageCaptureViewController ファイルで宣言されている CITImageCaptureDelegate プロトコルを実装するものとして宣言されています。
- 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
デリゲートとプロトコルがそれほど単純だとは思いませんが、どこかに小さな変更が欠けていると思います。正しい方向に進むのを手伝ってもらえますか?