2011-03-20 129 views
1

我遇到以下問題。我繼承了一個應用程序,我試圖修改它。原來的功能讓我可以添加一些帶有文字筆記的任務。我想添加一個圖標,使其更具視覺吸引力。當我修改代碼簽名傳遞圖標(在現實中,我只傳遞一個的NSString圖標的名稱)模塊停止工作,應用程序引發以下錯誤,基本上是無法識別的選擇:由於未捕獲的異常'NSInvalidArgumentException'而終止應用程序

2011-03-19 22:41:17.713 app[82653:207] -[RemindersDataManager addReminder:notes:locations:icon:]: unrecognized selector sent to instance 0xc700bc0 
2011-03-19 22:41:17.716 app[82653:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[RemindersDataManager addReminder:notes:locations:icon:]: unrecognized selector sent to instance 0xc700bc0' 
*** Call stack at first throw: 
(
     0 CoreFoundation      0x0162abe9 __exceptionPreprocess + 185 
     1 libobjc.A.dylib      0x0177f5c2 objc_exception_throw + 47 
     2 CoreFoundation      0x0162c6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
     3 CoreFoundation      0x0159c366 ___forwarding___ + 966 
     4 CoreFoundation      0x0159bf22 _CF_forwarding_prep_0 + 50 
     5 app        0x000158b1 -[GeoRemindersManager addReminder:notes:locations:icon:] + 121 
     6 app        0x0000f268 -[AddReminderViewController addReminder] + 655 
     7 UIKit        0x0053ea6e -[UIApplication sendAction:to:from:forEvent:] + 119 
     8 UIKit        0x005cd1b5 -[UIControl sendAction:to:forEvent:] + 67 
     9 UIKit        0x005cf647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527 
     10 UIKit        0x005ce1f4 -[UIControl touchesEnded:withEvent:] + 458 
     11 UIKit        0x007c9987 _UIGestureRecognizerSortAndSendDelayedTouches + 3609 
     12 UIKit        0x007ca0fc _UIGestureRecognizerUpdateObserver + 927 
     13 CoreFoundation      0x0160bfbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
     14 CoreFoundation      0x015a10e7 __CFRunLoopDoObservers + 295 
     15 CoreFoundation      0x01569bd7 __CFRunLoopRun + 1575 
     16 CoreFoundation      0x01569240 CFRunLoopRunSpecific + 208 
     17 CoreFoundation      0x01569161 CFRunLoopRunInMode + 97 
     18 GraphicsServices     0x01ce4268 GSEventRunModal + 217 
     19 GraphicsServices     0x01ce432d GSEventRun + 115 
     20 UIKit        0x0054d42e UIApplicationMain + 1160 
     21 app        0x00002d1c main + 102 
     22 app        0x00002cad start + 53 
) 
terminate called after throwing an instance of 'NSException'. 

這些都是原來模塊的簽名

AddReminderViewController.h

// user actions 
- (IBAction)addReminder; 

AddReminderViewController.m

- (IBAction)addReminder { 
     if ([self dataVerification]) { 
       BOOL result = NO; 
       // try to add one geo fence or several geo fences 
       if (self.address) { 
         result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text 
                                 coordinate:self.coordinate address:self.address]; 
       } 
       else if (self.locations) { 
         result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text locations:self.locations]; 
       } 
       // successfully added - close 
       if (result) { 
         [self.navigationController popToRootViewControllerAnimated:YES]; 
       } 

GeoRemindersManager.h

// shared instance 
+ (GeoRemindersManager *)sharedInstance; 
// workflow 
- (void)start; 
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes 
       coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address; 
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location; 
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations; 
- (void)changeReminder:(NSString *)title title:(NSString *)newTitle notes:(NSString *)newNotes; 
- (void)removeReminder:(NSString *)title; 
- (ReminderEntity *)getReminderWithTitle:(NSString *)title; 
- (NSArray *)getLoctionsWithCoordinate:(CLLocationCoordinate2D)coordinate; 
- (void)wakeByLocalNotification:(NSDictionary *)info; 
- (void)memoryWarning; 
- (CLLocation *)getCurrentLocation; 
// extra 
- (BOOL)checkReminderExistance:(NSString *)title; 
- (void)updateDelegatesWithReminder:(NSString *)title notes:(NSString *)notes; 

GeoRemindersManager.m

+ (GeoRemindersManager *)sharedInstance { 
     geoapp_iphoneAppDelegate *appDelegate = (geoapp_iphoneAppDelegate *)[MLSApplication instance]; 
     return appDelegate.remindersManager; 
} 

#pragma mark - 
#pragma mark workflow 

- (void)start { 
     // start first locating 
     [deviceLocation forceStart]; 
     // add geo fences to device location 
     NSArray *locations = [geoDataManager getAllRemindersLocations]; 
     [deviceLocation addMonitoringLocations:locations]; 
     // invoke delegate 
     [delegateMap didAddMonitoringLocations:locations]; 
} 

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes 
       coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address 
{ 
     if (![self checkReminderExistance:title]) { 
       return NO; 
     } 
     // all verifications are OK, adding reminder 
     [geoDataManager addReminder:title notes:notes coordinate:coordinate address:address]; 
     [self updateDelegatesWithReminder:title notes:notes]; 
     return YES; 
} 

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location { 
     return [self addReminder:title notes:notes locations:[NSArray arrayWithObject:location]]; 
} 

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations { 
     if (![self checkReminderExistance:title]) { 
       return NO; 
     } 
     // all verifications are OK, adding reminder 
     [geoDataManager addReminder:title notes:notes locations:locations]; 
     [self updateDelegatesWithReminder:title notes:notes]; 
     return YES; 
} 

和改性的:

AddReminderViewController.m

- (IBAction)addReminder { 
     if ([self dataVerification]) { 
       BOOL result = NO; 
       // try to add one geo fence or several geo fences 
       if (self.address) { 
         result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text coordinate:self.coordinate address:self.address icon:(NSString *)iconButton.currentTitle]; 
       } 
       else if (self.locations) { 
         result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text locations:self.locations icon:(NSString *)iconButton.currentTitle]; 
       } 
       // successfully added - close 
       if (result) { 
         [self.navigationController popToRootViewControllerAnimated:YES]; 
       } 
     } 
} 

GeoRemindersManager.h

// shared instance 
+ (GeoRemindersManager *)sharedInstance; 
// workflow 
- (void)start; 
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes 
     coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address icon:(NSString *)icon; 
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location icon:(NSString *)icon; 
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations icon:(NSString *)icon; 
- (void)changeReminder:(NSString *)title title:(NSString *)newTitle notes:(NSString *)newNotes icon:(NSString *)icon; 
- (void)removeReminder:(NSString *)title; 
- (ReminderEntity *)getReminderWithTitle:(NSString *)title; 
- (NSArray *)getLoctionsWithCoordinate:(CLLocationCoordinate2D)coordinate; 
- (void)wakeByLocalNotification:(NSDictionary *)info; 
- (void)memoryWarning; 
- (CLLocation *)getCurrentLocation; 
// extra 
- (BOOL)checkReminderExistance:(NSString *)title; 
- (void)updateDelegatesWithReminder:(NSString *)title notes:(NSString *)notes icon:(NSString *)icon; 

GeoRemindersManager.m

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes 
       coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address icon:(NSString *)icon 
{ 
     if (![self checkReminderExistance:title]) { 
       return NO; 
     } 
     // all verifications are OK, adding reminder 
     [geoDataManager addReminder:title notes:notes coordinate:coordinate address:address icon:icon]; 
     [self updateDelegatesWithReminder:title notes:notes icon:icon]; 
     return YES; 
} 

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location icon:(NSString *)icon{ 
     return [self addReminder:title notes:notes locations:[NSArray arrayWithObject:location icon:icon]]; 
} 

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations icon:(NSString *)icon { 
     if (![self checkReminderExistance:title]) { 
       return NO; 
     } 
     // all verifications are OK, adding reminder 
     [geoDataManager addReminder:title notes:notes locations:locations icon:icon]; 
     [self updateDelegatesWithReminder:title notes:notes]; 
     return YES; 
} 

因此,在短期,我增加了一個額外的參數這些功能的圖標名稱作爲的NSString的唯一的事......任何線索?所有幫助非常感謝!由於

+0

你有另一個叫做RemindersDataManager的類嗎? – 2011-03-20 03:40:30

+0

@Firoze Lafeer,是的,還有另一個類RemindersDataManager。不幸的是,這些構建這個噩夢的人使用了幾層間接方法,並重用了他們以前擁有的一堆庫,而不是從頭開始構建它。 – jason 2011-03-21 15:54:05

回答

3

該錯誤消息表示無法識別的選擇被稱爲類RemindersDataManager的對象,可能是從線

[geoDataManager addReminder:title notes:notes locations:locations icon:icon]; 

您應該發現類的實現和你的圖標參數添加到它的方法太(或者如果圖標沒有用處,則停止將圖標傳遞給它)。

相關問題