2011-01-08 8 views
2

mein Code irgendwo auf dem Weg brach, und stürzt ab, wenn die Tasten Navigationsleiste mitUnerkannte Selektor gesendet Instanz“Problem

Fehlermeldung:. *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView newMemoViewController:didAddMemo:]: unrecognized selector sent to instance 0x5b55a60'

Wenn das Debuggen, das Programm läuft die cancel Methode ., und löst eine Ausnahme bei der @synthesize Linie Allerdings kann ich damit nichts falsch sehen

die Symptome sind identisch, so dass ich bin mit dem entsprechenden Code nur für die Cancel Taste.

NewMemoViewController.h

#import <UIKit/UIKit.h> 
@protocol NewMemoDelegate; 


@class AKVoiceMemo; 


@interface NewMemoViewController : UIViewController { 
    @private 
     AKVoiceMemo *voiceMemo; 
     id <NewMemoDelegate> delegate; 
} 

@property (nonatomic, retain) AKVoiceMemo *voiceMemo; 
@property (nonatomic, assign) id <NewMemoDelegate> delegate; 

@end 

@protocol NewMemoDelegate <NSObject> 
- (void)newMemoViewController:(NewMemoViewController *)newMemoViewController didAddMemo:(AKVoiceMemo *)voiceMemo; 


@end 

NewMemoViewController.m

#import "NewMemoViewController.h" 

@synthesize delegate; 


- (void)viewDidLoad { 
    UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)]; 
    self.navigationItem.leftBarButtonItem = cancelButtonItem; 
    [cancelButtonItem release]; 
} 


- (void)cancel { 
    [self.delegate newMemoViewController:self didAddMemo:nil]; 
} 

Ihre Hilfe würde geschätzt.

bearbeiten: der Delegierte der RootViewController:

- (void)newMemoViewController:(NewMemoViewController *)newMemoViewController didAddMemo:(AKVoiceMemo *)voiceMemo { 
    if (voiceMemo){ 
     // Show the note in a new view controller 
     // TODO: Implement this 
    } 

    [self dismissModalViewControllerAnimated:YES]; 
} 

Antwort

5

Du bist wahrscheinlich die Delegierten von NewMemoViewController zu einem UIView Objekt Einstellung anstelle eines Objekts, das das NewMemoDelegate Protokoll implementiert.

Die Fehlermeldung sagt Ihnen, dass eine newMemoViewController:didAddMemo: Nachricht an ein UIView Objekt gesendet wurde und das UIView Objekt nicht wusste, was damit zu tun ist. Da Ihre cancel-Methode newMemoViewController:didAddMemo: auf dem Delegat aufruft, ist es der Delegat, der das UIView Objekt ist, das die newMemoViewController:didAddMemo: Nachricht nicht erkennt. Mit anderen Worten, Ihr Stellvertreter ist ein UIView und implementiert das Protokoll NewMemoDelegate nicht.

Wenn Sie den Delegaten richtig einstellen, dann macht @jtbandes einen großen Punkt: Der Delegierte wird wahrscheinlich freigegeben und ein UIView Objekt übernimmt den gleichen Speicherort und wird so "zufällig" zum Delegaten. Sie tun das Richtige, indem Sie das Attribut assign für Ihren Stellvertreter verwenden. Das ist ziemlich Standard Kakao-Praxis. Sie müssen jedoch sicherstellen, dass der Delegat von einem anderen Objekt beibehalten wird, und , das Objekt muss sicherstellen, dass der Delegat bleibt so lange, wie NewMemoViewController es benötigt.

+0

Hallo James, ich habe auch den Code aus dem RootViewController hinzugefügt. vergessen die Zeile aus dem Header hinzuzufügen: @interface RootViewController: UITableViewController Lassen Sie mich wissen, wenn ich – antalkerekes

+0

etwas fehlt bin, was Objekt Sie als Delegierter Einstellung? –

+0

Ich bin mir nicht sicher, was Sie meinen - der Delegat ist der Root-View-Controller, der das 'NewMemoDelegate'-Protokoll implementiert. Wenn die App abstürzt, ist "self.delegate" ** tatsächlich eine 'UIView', aber ich verstehe nicht warum. Ich schätze Ihre Hilfe, aber Sie müssen mich möglicherweise mit der Auflösung löffeln, da ich ein Delegierter in der Delegierung bin (und selbst programmiert) – antalkerekes

1

Ich schätze, Sie haben den Delegierten zu viel freigegeben. Ich bemerke, dass Sie @property (assign) ... delegate; haben. Dies bedeutet, dass jedes Mal, wenn Sie den Delegaten festlegen, dieses Objekt auch von etwas anderem beibehalten werden muss.

Die andere Möglichkeit ist der Delegat ist eigentlich eine UIView, aber ich vermute, es ist der andere Fall.

Verwandte Themen