Завершение приложения из-за необработанного исключения «NSInvalidArgumentException» - PullRequest
1 голос
/ 20 марта 2011

У меня следующая проблема.Я унаследовал приложение и пытаюсь его изменить.Оригинальная функциональность позволяет мне добавить задачу с некоторыми текстовыми заметками.Я хочу добавить значок, чтобы сделать его более привлекательным.Когда я изменяю подпись кода, чтобы передать значок (в действительности я передаю только имя значка в NSString), модули перестают работать, и приложение выдает следующую ошибку, в основном нераспознанный селектор:

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

Короче говоря, единственное, что я добавил, - это дополнительный аргумент к этой функции для имени иконки в виде строки NSS ... Какие-нибудь подсказки?Вся помощь с благодарностью!Спасибо

1 Ответ

3 голосов
/ 20 марта 2011

Сообщение об ошибке указывает, что нераспознанный селектор был вызван для объекта класса RemindersDataManager, вероятно, из строки

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

Вы должны найти реализацию этого класса и добавить параметр icon к его методам (или прекратить передачу значка в него, если он не используется для значка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...