ios - [登录 View Controller View Controller ] : unrecognized selector sent to instance 0x10942c3d0

标签 ios objective-c xcode

帮助!

我是 XCode 的新手,现在我遇到了一个问题。

当我在应用程序中使用以下代码并创建一个新的 ViewController 类 LoginViewController 时。

在 iPhone 中,该应用程序运行良好。但是当我在 iPad 上测试时它崩溃并在日志中显示以下内容:

2014-05-06 17:05:31.289 We Love HK[38711:60b] -[LoginViewController viewControllers]: unrecognized selector sent to instance 0x10942c3d0
2014-05-06 17:05:31.291 We Love HK[38711:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[LoginViewController viewControllers]: unrecognized selector sent to instance 0x10942c3d0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001019fc495 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010175b99e objc_exception_throw + 43
    2   CoreFoundation                      0x0000000101a8d65d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x00000001019edd8d ___forwarding___ + 973
    4   CoreFoundation                      0x00000001019ed938 _CF_forwarding_prep_0 + 120
    5   We Love HK                          0x0000000100001086 -[AppDelegate application:didFinishLaunchingWithOptions:] + 246
    6   UIKit                               0x00000001003033d9 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 264
    7   UIKit                               0x0000000100303be1 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1605
    8   UIKit                               0x0000000100307a0c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 660
    9   UIKit                               0x0000000100318d4c -[UIApplication handleEvent:withNewEvent:] + 3189
    10  UIKit                               0x0000000100319216 -[UIApplication sendEvent:] + 79
    11  UIKit                               0x0000000100309086 _UIApplicationHandleEvent + 578
    12  GraphicsServices                    0x0000000103b2b71a _PurpleEventCallback + 762
    13  GraphicsServices                    0x0000000103b2b1e1 PurpleEventCallback + 35
    14  CoreFoundation                      0x000000010197e679 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
    15  CoreFoundation                      0x000000010197e44e __CFRunLoopDoSource1 + 478
    16  CoreFoundation                      0x00000001019a7903 __CFRunLoopRun + 1939
    17  CoreFoundation                      0x00000001019a6d83 CFRunLoopRunSpecific + 467
    18  UIKit                               0x00000001003072e1 -[UIApplication _run] + 609
    19  UIKit                               0x0000000100308e33 UIApplicationMain + 1010
    20  We Love HK                          0x00000001000044b3 main + 115
    21  libdyld.dylib                       0x000000010207f5fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

和LoginViewController.h:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "KeychainItemWrapper.h"

@import Security;

@interface LoginViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic, retain) IBOutlet UILabel *version_label;

@property (strong, nonatomic) IBOutlet UITextField *txtUsername;
@property (strong, nonatomic) IBOutlet UITextField *txtPassword;


- (IBAction) loginClicker:(id)sender;
- (IBAction) backgroundTap:(id)sender;
- (IBAction) keyboardDismiss: (id) sender;
- (IBAction) click_exit: (id)  sender;

@end

登录 View Controller .m:

#import "LoginViewController.h"

@implementation LoginViewController;

@synthesize version_label;
@synthesize txtUsername;
@synthesize txtPassword;

-(void)viewDidLoad
{
    KeychainItemWrapper *keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserAuthToken" accessGroup:nil];
    NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];  // Get App Version
    NSString *build = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];  // Get App Build Number
    version_label.numberOfLines = 0;                               // Enable \n break line
    version_label.hidden = NO;                                     // Disable Hidden
    //[keychainWrapper resetKeychainItem];
    version_label.text = [NSString stringWithFormat:@"V %@ (Build %@)", version, build];    // Change Version Label's Content
     if ([keychainWrapper objectForKey:(__bridge id)(kSecAttrAccount)] && [keychainWrapper objectForKey:(__bridge id)(kSecValueData)]){
        txtUsername.text = [keychainWrapper objectForKey:(__bridge id)(kSecAttrAccount)];
        txtPassword.text = [keychainWrapper objectForKey:(__bridge id)(kSecValueData)];
    }
}

-(IBAction) keyboardDismiss: (id) sender{
    [txtUsername resignFirstResponder];
    [txtPassword resignFirstResponder];
}

- (IBAction)backgroundTap:(id)sender {
    [txtUsername resignFirstResponder];
    [txtPassword resignFirstResponder];
}

- (IBAction)click_exit:(id)sender {
    //[txtUsername resignFirstResponder];
    //[txtPassword resignFirstResponder];
}

- (IBAction)loginClicker:(id)sender {
    NSInteger success = 0;
    @try {

        if([[self.txtUsername text] isEqualToString:@""] || [[self.txtPassword text] isEqualToString:@""] ) {

            [self alertStatus:@"請輸入帳號及密碼!" :@"登入失敗!" :0];

        } else {
            KeychainItemWrapper *keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserAuthToken" accessGroup:nil];
            NSString *post =[[NSString alloc] initWithFormat:@"username=%@&password=%@",[self.txtUsername text],[self.txtPassword text]];
            NSLog(@"PostData: %@",post);

            NSURL *url=[NSURL URLWithString:@"http://ls.arefly.com/other/php/welovehk/login.php"];

            NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

            NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];

            NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
            [request setURL:url];
            [request setHTTPMethod:@"POST"];
            [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
            [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
            [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
            [request setHTTPBody:postData];

            //[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];

            NSError *error = [[NSError alloc] init];
            NSHTTPURLResponse *response = nil;
            NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

            NSLog(@"Response code: %ld", (long)[response statusCode]);

            if ([response statusCode] >= 200 && [response statusCode] < 300)
            {
                NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
                NSLog(@"Response ==> %@", responseData);

                NSError *error = nil;
                NSDictionary *jsonData = [NSJSONSerialization
                                          JSONObjectWithData:urlData
                                          options:NSJSONReadingMutableContainers
                                          error:&error];

                success = [jsonData[@"login_status"] integerValue];
                NSLog(@"Success: %ld", (long)success);

                if(success == 1)
                {
                    NSLog(@"Login SUCCESS");
                    [keychainWrapper setObject:[self.txtUsername text] forKey:(__bridge id)(kSecAttrAccount)];
                    [keychainWrapper setObject:[self.txtPassword text] forKey:(__bridge id)(kSecValueData)];
                    NSString *name_msg = (NSString *) jsonData[@"name_msg"];
                    [self alertStatus:name_msg :@"歡迎!" :0];
                } else {
                    NSString *error_msg = (NSString *) jsonData[@"error_message"];
                    [self alertStatus:error_msg :@"登入失敗!" :0];
                    txtPassword.text = @"";
                }

            } else {
                //if (error) NSLog(@"Error: %@", error);
                [self alertStatus:@"Connection Failed" :@"登入失敗!" :0];
                txtPassword.text = @"";
            }
        }
    }
    @catch (NSException * e) {
        NSLog(@"Exception: %@", e);
        [self alertStatus:@"登入失敗!" :@"錯誤:" :0];
        txtPassword.text = @"";
    }
    if (success) {
        [self performSegueWithIdentifier:@"login_success" sender:self];
    }

}

- (void) alertStatus:(NSString *)msg :(NSString *)title :(int) tag
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                        message:msg
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil, nil];
    alertView.tag = tag;
    [alertView show];
}

@end

这里还有 AppDelegate.m 中的 didFinishLaunchingWithOptions(但我不认为我改变了它的任何内容):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }
    return YES;
}

这是我的 Main_iPad.storyboard:

http://uploadpie.com/rTIVc

这是我的 Main_iPhone.storyboard:

http://uploadpie.com/gmpms

谁能帮帮我?

谢谢!

更新

在我对 -(BOOL)application:didFinishLaunchingWithOptions: 中的整个 if block 进行注释后,它变得正常并且不会崩溃。

但是当我想做 [self performSegueWithIdentifier:@"login_success"sender:self];

时会出现其他崩溃
2014-05-06 18:55:28.839 We Love HK[45660:60b] Success: 1
2014-05-06 18:55:28.839 We Love HK[45660:60b] Login SUCCESS
2014-05-06 18:55:28.887 We Love HK[45660:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a Split View Controllers modally <LoginViewController: 0x109429ca0>.'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001019fc495 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010175b99e objc_exception_throw + 43
    2   UIKit                               0x0000000100408c93 -[UIViewController presentViewController:withTransition:completion:] + 4027
    3   We Love HK                          0x0000000100005a35 -[LoginViewController loginClicker:] + 3813
    4   UIKit                               0x0000000100309f06 -[UIApplication sendAction:to:from:forEvent:] + 80
    5   UIKit                               0x0000000100309eb4 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 17
    6   UIKit                               0x00000001003e6880 -[UIControl _sendActionsForEvents:withEvent:] + 203
    7   UIKit                               0x00000001003e595d -[UIControl touchesBegan:withEvent:] + 219
    8   UIKit                               0x0000000100340b74 -[UIWindow _sendTouchesForEvent:] + 300
    9   UIKit                               0x00000001003416e4 -[UIWindow sendEvent:] + 925
    10  UIKit                               0x000000010031929a -[UIApplication sendEvent:] + 211
    11  UIKit                               0x0000000100306aed _UIApplicationHandleEventQueue + 9579
    12  CoreFoundation                      0x000000010198bd21 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    13  CoreFoundation                      0x000000010198b5f2 __CFRunLoopDoSources0 + 242
    14  CoreFoundation                      0x00000001019a746f __CFRunLoopRun + 767
    15  CoreFoundation                      0x00000001019a6d83 CFRunLoopRunSpecific + 467
    16  GraphicsServices                    0x0000000103b29f04 GSEventRunModal + 161
    17  UIKit                               0x0000000100308e33 UIApplicationMain + 1010
    18  We Love HK                          0x00000001000045b3 main + 115
    19  libdyld.dylib                       0x000000010207f5fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

我还想知道如何从不同的地方设置 splitViewController.delegate?

最佳答案

您应该适本地共享您的 application:didFinishLaunchingWithOptions: 方法。

我很确定您在某处使用 LoginViewController 用作 UINavigationControllerUISplitViewController。这就是为什么要在那里调用 viewControllers 方法的原因。

根据您的application:didFinishLaunchingWithOptions 方法,它在这里崩溃

UINavigationController *navigationController = [splitViewController.viewControllers lastObject];

可能你的 iPad Storyboard中有错误的 InitialViewController

关于ios - [登录 View Controller View Controller ] : unrecognized selector sent to instance 0x10942c3d0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490482/

相关文章:

ios - Xcode 6 中找不到本地身份验证框架

Xcode 4 目标build设置 "Skip install"。它是什么?

c - Xcode 编辑器不包含 stdio.h

iphone - 如何声明实例变量和方法在类实例之外不可见或不可用?

ios - swift 3.0 : Timer not firing for target other than self

objective-c - Objective C 嵌套字典访问无效选择器错误

ios - 如何使我的注释标注指向不同的 View Controller ?

ios - ios ios nsrange char从结束

ios - 在异步 block 中使用xcode 7.0 beta处理错误

来自 ipod 库的 ios 时间拉伸(stretch)歌曲