нераспознанный селектор отправлен в класс 0x51e8′

#iphone #ios

#iPhone #iOS

Вопрос:

У меня возникает эта ошибка, когда я пытаюсь передать значение uitextfeild из моего метода TableView: didSelectRowAtIndexPath: в моем uitableview в мой класс nsobject, однако, когда я нажимаю uitableviewcell, который я закодировал для передачи значения uitextfield, я получаю ошибку, указанную ниже.

//DBAccess.h

     @interface DBAccess : NSObject {

        NSString *receiveCodeText;

    }

    @property (nonatomic, retain) IBOutlet NSString *receiveCodeText;

- (NSMutableArray *) getAllMakes;
    - (void) setPassCode:(NSString *)theCode;
  

//DBAccess.m

 //...
//Need to set my string here..
- (void)setPassCode:(NSString *)theCode{
    receiveCodeText = theCode;
}
//...
- (NSMutableArray *)getAllMakes{
//...
const char *value = [receiveCodeText cStringUsingEncoding:NSUTF8StringEncoding]; //reciveCodeText is set in RootViewController and passed to value here
    [receiveCodeText release];
    sqlite3_bind_text(statement, 1, value, -1, SQLITE_TRANSIENT);

//....
}
  

//ViewController.m

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    searchTableViewController *searchTable = [[searchTableViewController alloc] initWithNibName:@"searchTableViewController" bundle:nil];

    switch (indexPath.row) {
        case 1: {
            searchTable.editedFieldName = @"Make";
            //Pass code number over to DBAccess class
            [DBAccess setPassCode:codeText.text];
        } break;
        case 2: {
            searchTable.editedFieldName = @"Mod";
        } break;
        case 3: {
            searchTable.editedFieldName = @"Method";
        } break;
    }

    [self.navigationController pushViewController:searchTable animated:YES];
    [searchTable release];
}
  

И это ошибка, которую я получаю.

 > 2011-06-13 13:05:33.433
> Code1.6[1318:207]  [DBAccess
> setPassCode:]: unrecognized selector
> sent to class 0x51e8 2011-06-13
> 13:05:33.477 Code1.6[1318:207] ***
> Terminating app due to uncaught
> exception
> 'NSInvalidArgumentException', reason:
> ' [DBAccess setPassCode:]:
> unrecognized selector sent to class
> 0x51e8'
> *** Call stack at first throw: (  0   CoreFoundation                     
> 0x00e45be9 __exceptionPreprocess   185
>   1   libobjc.A.dylib                  
> 0x00f9a5c2 objc_exception_throw   47
>   2   CoreFoundation                   
> 0x00e477bb  [NSObject(NSObject)
> doesNotRecognizeSelector:]   187  3  
> CoreFoundation                     
> 0x00db7366 ___forwarding___   966     4  
> CoreFoundation                     
> 0x00db6f22 _CF_forwarding_prep_0   50
>   5   Code1.6                       
> 0x000028ff -[RootViewController
> tableView:didSelectRowAtIndexPath:]  
> 253   6   UIKit                        
> 0x00331794 -[UITableView
> _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:]
>   1140    7   UIKit                               0x00327d50 -[UITableView
> _userSelectRowAtPendingSelectionIndexPath:]
>   219     8   Foundation                          0x0003a7f6 __NSFireDelayedPerform  
> 441   9   CoreFoundation               
> 0x00e26fe3

> __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
>   19  10  CoreFoundation                      0x00e28594 __CFRunLoopDoTimer   1220
>   11  CoreFoundation                   
> 0x00d84cc9 __CFRunLoopRun   1817  12 
> CoreFoundation                     
> 0x00d84240 CFRunLoopRunSpecific   208
>   13  CoreFoundation                   
> 0x00d84161 CFRunLoopRunInMode   97    14
> GraphicsServices                   
> 0x016e7268 GSEventRunModal   217  15 
> GraphicsServices                   
> 0x016e732d GSEventRun   115   16  UIKit
> 0x002ca42e UIApplicationMain   1160
>   17  Code1.6                       
> 0x0000230c main   102     18  Code1.6    
> 0x0000229d start   53 ) terminate
> called after throwing an instance of
> 'NSException'
  

Ответ №1:

setPassCode, похоже, является методом экземпляра класса, а не статическим методом, но вы пытаетесь получить к нему доступ как к статическому методу, вы должны объявить ваш метод таким образом, чтобы он был статическим

  (void)setPassCode....
  

Ваша программа выходит из строя, потому что вы вызываете метод для самого класса, а не для экземпляра класса..
Надеюсь, это поможет

Комментарии:

1. ах .. это имеет смысл! однако во время сборки у меня теперь есть экземпляр, к которому можно получить доступ в предупреждении метода класса… и когда я нажимаю на tableviewcell, он просто выходит из строя без ошибок.. странно или что.

2. У вас должно было быть какое-то предупреждение раньше.. Однако не уверен, что вы делаете сейчас, изменили ли вы объявление и реализацию, чтобы оба имели ?

3. Хорошо, итак, предупреждение исчезло, но оно все еще просто падает каждый раз, когда я нажимаю на tableviwcell… Я прочитал, и это может быть из-за попытки получить доступ к области памяти, которая не выделена / доступна…

4. В какой строке он это делает? Если это то же самое, попробуйте отправить какую-нибудь другую строку, возможно, эта метка является виновником… Есть какое-либо сообщение с консоли?

5. Нет, я разобрался, в чем проблема. Я определил метод с помощью ‘ ‘ — это делает его классовым (статическим) методом. и вы не можете получить доступ ни к каким переменным экземпляра в таких методах по определению (поскольку это НЕ метод экземпляра, вы не можете получить доступ к переменным экземпляра). Итак, мне нужно выяснить, как обойти это, я попытался создать другой метод экземпляра, которому передается его переменная из метода класса. однако это не работает, есть идеи?