开发者

[UIView didCreateWorkout:Type:Distance:Time:Message:]: unrecognized selector sent to instance

I'm getting the above error and have been looking at it all day, I'm getting no where fast. Anyone any ideas ? I'm new to IPhone Development. Code Below:

WorkoutAppDelegate.h...:

#import "WorkoutViewController.h"

@interface WorkoutAppDelegate : NSObject <UIApplicationDelegate> {

    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;       
    NSPersistentStoreCoordinator *persistentStoreCoordinator;

    UIWindow *window;
    WorkoutViewController *viewController;
}

- (IBAction)saveAction:sender;

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@property (nonatomic, readonly) NSString *applicationDocumentsDirectory;

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet WorkoutViewController *viewController;


@end

WorkoutAppDelegate.m....:

#import "WorkoutAppDelegate.h"

@implementation WorkoutAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    // Override point for customization after app launch    
    viewController.managedObjectContext = [self managedObjectContext];
    [window add开发者_Python百科Subview:viewController.view];
    [window makeKeyAndVisible];
}


/**
 applicationWillTerminate: saves changes in the application's managed object context before the application terminates.
 */
- (void)applicationWillTerminate:(UIApplication *)application {

    NSError *error;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Handle error
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();  // Fail
        } 
    }
}


/**
 Performs the save action for the application, which is to send the save:
 message to the application's managed object context.
 */
- (IBAction)saveAction:(id)sender {

    NSError *error;
    if (![[self managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();  // Fail
    }
}


/**
 Returns the managed object context for the application.
 If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
 */
- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return managedObjectContext;
}


/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created by merging all of the models found in the application bundle.
 */
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}


/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"WorkoutCoreData.sqlite"]];

    NSError *error;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
        // Handle error
    }    

    return persistentStoreCoordinator;
}


/**
 Returns the path to the application's documents directory.
 */
- (NSString *)applicationDocumentsDirectory {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}


- (void)dealloc {
    [managedObjectContext release];
    [managedObjectModel release];
    [persistentStoreCoordinator release];

    [viewController release];
    [window release];
    [super dealloc];
}


@end

WorkoutViewController.h...:

#import <UIKit/UIKit.h>
#import "Workout.h"

@protocol CreateWorkoutDelegate <NSObject> 

-(void)didCancelWorkout;
-(void)didCreateWorkout:(NSString *)thisRoute
                   Type:(NSString *)thisType
               Distance:(NSString *)thisDistance
                   Time:(NSString *)thisTime
                Message:(NSString *)thisMessage;

@end


@interface WorkoutViewController : UIViewController {
//  IBOutlet UIlabel *Speed;
//  IBOutlet UIlabel *Calories;
    IBOutlet UILabel *DBContents;
    IBOutlet UITextField *route;
    IBOutlet UITextField *type;
    IBOutlet UITextField *distance;
    IBOutlet UITextField *time;
    IBOutlet UITextField *message;
    IBOutlet UIButton *saveWorkout;
    IBOutlet UIButton *cancelWorkout;
    NSMutableArray *workoutArray;
    id workoutDelegate;
    Workout *currentWorkout;
    NSManagedObjectContext *managedObjectContext;
}


//@property (retain,nonatomic) UILabel *Speed;
//@property (retain,nonatomic) UILabel *Calories;
@property (retain,nonatomic) UILabel *DBContents;
@property (retain,nonatomic) UITextField *route;
@property (retain,nonatomic) UITextField *type;
@property (retain,nonatomic) UITextField *distance;
@property (retain,nonatomic) UITextField *time;
@property (retain,nonatomic) UITextField *message;
@property (retain,nonatomic) NSMutableArray *workoutArray;
//@property (retain,nonatomic) UIButton *saveWorkout;
//@property (retain,nonatomic) UIButton *cancelWorkout;
@property (nonatomic, assign) id<CreateWorkoutDelegate> workoutDelegate;
@property (nonatomic, assign) NSManagedObjectContext *managedObjectContext;

-(IBAction)hideKeyboard;
-(IBAction)saveWorkout; 
-(IBAction)cancelWorkout;

@end

WorkoutViewController.m...:

#import "WorkoutViewController.h"
#import "Workout.h"

@implementation WorkoutViewController

@synthesize workoutDelegate;
//@synthesize Speed;
//@synthesize Calories;
@synthesize route;
@synthesize type;
@synthesize distance;
@synthesize time;
@synthesize message;
@synthesize DBContents;
@synthesize workoutArray;
@synthesize managedObjectContext;
//@synthesize saveWorkout;
//@synthesize cancelWorkout;


-(IBAction)hideKeyboard {
}


-(IBAction)saveWorkout {
    [workoutDelegate didCreateWorkout: route.text
                                      Type: type.text
                                  Distance: distance.text
                                      Time: time.text
                                   Message: message.text];
}


-(IBAction)cancelWorkout {
    [self.workoutDelegate didCancelWorkout];
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.


-(void)viewDidLoad {
    //Set images for Save & Cancel buttons.
    UIImage *normalImage = [[UIImage imageNamed:@"whiteButton.png"] 
                            stretchableImageWithLeftCapWidth:12.0 
                            topCapHeight:0.0];
    [saveWorkout setBackgroundImage:normalImage forState:UIControlStateNormal];
    [cancelWorkout setBackgroundImage:normalImage forState:UIControlStateNormal];

    UIImage *pressedImage = [[UIImage imageNamed:@"blueButton.png"]
                             stretchableImageWithLeftCapWidth:12.0 
                             topCapHeight:0.0];
    [saveWorkout setBackgroundImage:pressedImage forState:UIControlStateHighlighted];
    [cancelWorkout setBackgroundImage:pressedImage forState:UIControlStateHighlighted];

    //Fetch details from the database.
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Workout" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    NSError *error;
    self.workoutArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    [request release];

    //self.workoutArray = [[NSMutableArray alloc] init];

    //self.DBContents.text = [self.workoutArray objectAtIndex:0];

    [super viewDidLoad];
}


-(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;
}


-(void) didCreateWorkout:(NSString *)thisRoute
                    Type:(NSString *)thisType
                Distance:(NSString *)thisDistance
                    Time:(NSString *)thisTime
                 Message:(NSString *)thisMessage {

    // Add the new workout.
    Workout *newWorkout = [NSEntityDescription 
                           insertNewObjectForEntityForName:@"Workout"
                           inManagedObjectContext:self.managedObjectContext];
    newWorkout.route = thisRoute;
    newWorkout.type = thisType;
    newWorkout.distance = thisDistance;
    newWorkout.time = thisTime;
    newWorkout.message = thisMessage;

    [self.workoutArray addObject:newWorkout];
    //[self dismissModalViewControllerAnimated:YES];
}


-(void)didCancelWorkout {
    [self dismissModalViewControllerAnimated:YES];
}


-(void)dealloc {
//  [Speed release];
//  [Calories release];
    [route release];
    [type release];
    [distance release];
    [time release];
    [message release];
//  [saveWorkout release];
//  [cancelWorkout release];
    [workoutArray release];
    [managedObjectContext release];
    [super dealloc];
}


@end

I'm trying to save details that I key on the screen (WorkoutViewController.xib) and I click the save button and get the above error.

Thanks Stephen


The error is saying that UiView does not know (does not implement) the method -(void)didCreateWorkout .......and really if you look where you have implemented this method, you will see it is in WorkoutViewController (WorkoutViewController.m), which is not an UIView (I presume you have only one implementation of didCreateWorkout in your project). You should double check how you set the workoutDelegate property. From the code you show us it should be an instance of WorkoutViewController.

Btw., because you are having the implementaion of the -(IBAction)saveWorkout also in WorkoutViewController the quick fix for this particular problem would be to change the code of your actions to:

-(IBAction)saveWorkout {
    [self didCreateWorkout: route.text
                                  Type: type.text
                              Distance: distance.text
                                  Time: time.text
                               Message: message.text];
}
-(IBAction)cancelWorkout {
    [self didCancelWorkout];
}

However, this quick fix will not fix the problem with the design you probably intended. You should think through who should implement CreateWorkoutDelegate and then properly set the workoutDelegate property.

On a different topic I noticed two things in your code, which you might to consider to change:

  • use self.property=nil instead of [ivar release] in your dealloc methods
  • NSString properties should have attribute copy (in order to protect yourself from NSMutableString instances)

Good luck! ;)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜