0

私はiPadの描画アプリで作業しています..私はUIView ControllerにインポートしたUIViewクラスを持っていました。しかし、次の[self.view drawPic:image];ようなエラーが発生しています: uiview インスタンス メッセージのレシーバー タイプは、セレクター 'drawPic' を使用してメソッドを宣言していません。

以下の私の完全なコードを見つけてください:

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface signPage : UIViewController<UIImagePickerControllerDelegate>{ 

    }
@property (retain, nonatomic) IBOutlet UIImageView * myImg;

@end



#import "signPage.h"
#import "DrawView.h"

@implementation signPage
@synthesize myImg;

- (void)viewDidLoad {
    [super viewDidLoad];
}



- (IBAction)clear {
    [self.view cancelDrawing];
}

- (IBAction)saveDrawing {
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *finishedPic = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIImageWriteToSavedPhotosAlbum(finishedPic, self, @selector(exitProg:didFinishSavingWithError:contextInfo:), nil);
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {

    [self dismissModalViewControllerAnimated:YES];

    [self.view drawPic:image];

}   

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [self dismissModalViewControllerAnimated:YES];


}

-(void)exitProg:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Your picture has been saved" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
    [alertView show];


}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}




@end

@interface DrawView : UIView {

    UIImage *myPic;
    NSMutableArray *myDrawing;
}



@end


#import "DrawView.h"


@implementation DrawView

-(void)drawPic:(UIImage *)thisPic {

    myPic = thisPic;

    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {

    float newHeight;
    float newWidth;

    if (!myDrawing) {
        myDrawing = [[NSMutableArray alloc] initWithCapacity:0];
    }
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    if (myPic != NULL) {
        float ratio = myPic.size.height/151;
        if (myPic.size.width/302 > ratio) {
            ratio = myPic.size.width/302;
        }

        newHeight = myPic.size.height/ratio;
        newWidth = myPic.size.width/ratio;

        [myPic drawInRect:CGRectMake(109,552,newWidth,newHeight)];
    }
    if ([myDrawing count] > 0) {
        CGContextSetLineWidth(ctx, 5);

        for (int i = 0 ; i < [myDrawing count] ; i++) {
            NSArray *thisArray = [myDrawing objectAtIndex:i];

            if ([thisArray count] > 2) {
                float thisX = [[thisArray objectAtIndex:0] floatValue];
                float thisY = [[thisArray objectAtIndex:1] floatValue];

                CGContextBeginPath(ctx);
                CGContextMoveToPoint(ctx, thisX, thisY);

                for (int j = 2; j < [thisArray count] ; j+=2) {
                    thisX = [[thisArray objectAtIndex:j] floatValue];
                    thisY = [[thisArray objectAtIndex:j+1] floatValue];

                    CGContextAddLineToPoint(ctx, thisX,thisY);
                }
                CGContextStrokePath(ctx);
            }
        }
    }
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    [myDrawing addObject:[[NSMutableArray alloc] initWithCapacity:4]];

    CGPoint curPoint = [[touches anyObject] locationInView:self];
    [[myDrawing lastObject] addObject:[NSNumber numberWithFloat:curPoint.x]];
    [[myDrawing lastObject] addObject:[NSNumber numberWithFloat:curPoint.y]];
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    CGPoint curPoint = [[touches anyObject] locationInView:self];
    [[myDrawing lastObject] addObject:[NSNumber numberWithFloat:curPoint.x]];
    [[myDrawing lastObject] addObject:[NSNumber numberWithFloat:curPoint.y]];

    [self setNeedsDisplay];
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    CGPoint curPoint = [[touches anyObject] locationInView:self];
    [[myDrawing lastObject] addObject:[NSNumber numberWithFloat:curPoint.x]];
    [[myDrawing lastObject] addObject:[NSNumber numberWithFloat:curPoint.y]];

    [self setNeedsDisplay];

}

-(void)cancelDrawing {

    [myDrawing removeAllObjects];
    [self setNeedsDisplay];

}




@end

よろしくお願いします。

4

3 に答える 3

2

drawPic:クラスに対してのみ定義しましDrawViewたが、これは のどこにも使用されていないようですUIViewController。関数にすべてUIViewのクラスからアクセスできるようにする場合は、カテゴリDrawPicとして定義する必要があります。

于 2012-05-17T06:22:12.293 に答える
0

SignPage.xib IBOutlet に UIView (クラス タイプ DrawView) を追加し、.h ファイルの drawView とリンクします。

@interface signPage : UIViewController<UIImagePickerControllerDelegate>{

    IBOutlet    UIView      *drawView;
}

@property (retain, nonatomic) IBOutlet UIImageView * myImg;

@end

signPage.m を呼び出す必要がある場所では、次のような DrawView メソッドにアクセスします。

DrawView*dView = (DrawView*)drawView;
[dView drawPic:image];

ところで:signPageクラスはSignPage(最初の文字が大文字)でなければなりません

于 2012-05-17T07:08:57.677 に答える
0

プロパティ名を view から mView などに変更します

@class DrawView;
@interface signPage : UIViewController<UIImagePickerControllerDelegate>{ 

    }
@property (retain, nonatomic) IBOutlet UIImageView * myImg;

@property (retain, nonatomic)DrawView * mView;

@end

実装時:

@synthesize mView = _mView;

今すぐ呼び出します:

[self.mView drawRect];
于 2012-05-17T06:15:17.883 に答える