Domanda

I am making a login application follow http://dipinkrishna.com/blog/2013/12/ios-login-screen-tutorial-xcode-5-ios-7-storyboard-json/.

When I test the APP on iPhone. Everything works great.

But when I test on iPad the APP crash when

[self performSegueWithIdentifier:@"login_success" sender:self];

Here is the crash log:

2014-05-06 19:37:23.662 We Love HK[50458:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a Split View Controllers modally <LoginViewController: 0x10934f960>.'
*** 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                          0x0000000100005a2d -[LoginViewController loginClicker:] + 3805
    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) 

And 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

LoginViewController.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

and here also didFinishLaunchingWithOptions in AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}

and here is my Main_iPad.storyboard:

uploadpie.com/rTIVc

and here is my Main_iPhone.storyboard:

uploadpie.com/gmpms

Can any one help me?

Thanks!

UPDATE

If i change Model to Push in the storyboard, the APP still crash, but it is a different log:

2014-05-06 19:59:32.972 We Love HK[51824:60b] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'login_success'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001019fc495 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010175b99e objc_exception_throw + 43
    2   UIKit                               0x00000001007d1865 -[UIStoryboardPushSegue destinationContainmentContext] + 0
    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) 
È stato utile?

Soluzione

Your segue is modal. Change its mode to push or whatever is more appropriate.

Altri suggerimenti

Change the style of StoryBoard segue which u used to push from "Modal" to "Push".

I got similar problem and struggled a while.

It was turned out that I deleted "Main.storyboard" file from the Copy Bundle Resources accidentally.

Just in case, make sure your "Main.storyboard" file is in the bundle list.

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top