2014-01-09 44 views
3

在Xcode 5.0.2中,我創建了一個帶導航控制器的簡單iPhone應用程序(源代碼可用at GitHub),它首先顯示帶有Facebook oAuth dialog的Web視圖,認證和她的細節已經進賬 - 試圖推DetailViewController:performSegueWithIdentifier花費了一分鐘以執行或崩潰

storyboard screenshot

在上面的故事板我已經叫SEGUE segue和下面的代碼將其推入了ViewController.m

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

NSLog(@"id: %@", dict[@"id"]); 
NSLog(@"first_name: %@", dict[@"first_name"]); 
NSLog(@"last_name: %@", dict[@"last_name"]); 
NSLog(@"gender: %@", dict[@"gender"]); 
NSLog(@"city: %@", dict[@"location"][@"name"]); 

Facebook的用戶數據被取出微細且幾乎立即打印:

id: 597287941 
first_name: Alexander 
last_name: Farber 
gender: male 
city: Bochum, Germany 

但隨後約一分鐘經過SEGUE發生或有時該應用甚至崩潰之前:

2014-01-09 22:11:29.017 oauthFacebook[4012:1403] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<DetailViewController 0x8a89cd0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key id.' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0173b5e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x014be8b6 objc_exception_throw + 44 
    2 CoreFoundation      0x017cb6a1 -[NSException raise] + 17 
    3 Foundation       0x0117f9ee -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] + 282 
    4 Foundation       0x010ebcfb _NSSetUsingKeyValueSetter + 88 
    5 Foundation       0x010eb253 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 267 
    6 Foundation       0x0114d70a -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 412 
    7 UIKit        0x004cea15 -[UIRuntimeOutletConnection connect] + 106 
    8 libobjc.A.dylib      0x014d07d2 -[NSObject performSelector:] + 62 
    9 CoreFoundation      0x01736b6a -[NSArray makeObjectsPerformSelector:] + 314 
    10 UIKit        0x004cd56e -[UINib instantiateWithOwner:options:] + 1417 
    11 UIKit        0x0033f605 -[UIViewController _loadViewFromNibNamed:bundle:] + 280 
    12 UIKit        0x0033fdad -[UIViewController loadView] + 302 
    13 UIKit        0x003400ae -[UIViewController loadViewIfRequired] + 78 
    14 UIKit        0x003405b4 -[UIViewController view] + 35 
    15 UIKit        0x0035a3e2 -[UINavigationController _startCustomTransition:] + 778 
    16 UIKit        0x003670c7 -[UINavigationController _startDeferredTransitionIfNeeded:] + 688 
    17 UIKit        0x00367cb9 -[UINavigationController __viewWillLayoutSubviews] + 57 
    18 UIKit        0x004a1181 -[UILayoutContainerView layoutSubviews] + 213 
    19 UIKit        0x00297267 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355 
    20 libobjc.A.dylib      0x014d081f -[NSObject performSelector:withObject:] + 70 
    21 QuartzCore       0x03b492ea -[CALayer layoutSublayers] + 148 
    22 QuartzCore       0x03b3d0d4 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380 
    23 QuartzCore       0x03b3cf40 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26 
    24 QuartzCore       0x03aa4ae6 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294 
    25 QuartzCore       0x03aa5e71 _ZN2CA11Transaction6commitEv + 393 
    26 QuartzCore       0x03aa60c2 _ZN2CA11Transaction14release_threadEPv + 226 
    27 libsystem_pthread.dylib    0x01e7681c _pthread_tsd_cleanup + 93 
    28 libsystem_pthread.dylib    0x01e7327e _pthread_exit + 108 
    29 libsystem_pthread.dylib    0x01e73dd8 pthread_workqueue_setdispatchoffset_np + 0 
    30 libsystem_pthread.dylib    0x01e77cce start_wqthread + 30 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

什麼可能是這種行爲的原因嗎?

UPDATE:

我已經清理IBOutlets通過Savana(感謝)的建議,但應用程序仍然崩潰:

2014-01-10 10:26:59.379 oauthFacebook[4342:4113] bool _WebTryThreadLock(bool), 0x8be2960: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now... 
1 0x51481ae WebThreadLock 
2 0x452a57 -[UIWebDocumentView _responderForBecomeFirstResponder] 
3 0x27da9e -[UIView setUserInteractionEnabled:] 
4 0x934d72 -[_UIViewControllerTransitionContext _disableInteractionForViews:] 
5 0x368573 -[UINavigationController pushViewController:transition:forceImmediate:] 
6 0x3680b5 -[UINavigationController pushViewController:animated:] 
7 0x770c65 -[UIStoryboardPushSegue perform] 
8 0x76107e -[UIStoryboardSegueTemplate _perform:] 
9 0x342280 -[UIViewController performSegueWithIdentifier:sender:] 
10 0x29f0 __32-[ViewController fetchFacebook:]_block_invoke 
11 0x11da695 __67+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_2 
12 0x113a945 -[NSBlockOperation main] 
13 0x1193829 -[__NSOperationInternal _start:] 
14 0x1110558 -[NSOperation start] 
15 0x1195af4 __NSOQSchedule_f 
16 0x1ae74b0 _dispatch_client_callout 
17 0x1ad4018 _dispatch_async_redirect_invoke 
18 0x1ae74b0 _dispatch_client_callout 
19 0x1ad5eeb _dispatch_root_queue_drain 
20 0x1ad6137 _dispatch_worker_thread2 
21 0x1e73dab _pthread_wqthread 
22 0x1e77cce start_wqthread 
(lldb) 

而且還當我添加了performSegueWithIdentifier調用之前的assert([NSThread isMainThread]); ,我可以看到這不是主線程...

正在對主線程調用performSegueWithIdentifier的要求嗎?

+1

問題在您的DetailViewController中。這可能是一些事情......但首先我會在DetailViewController中檢查IBOutlets和IBActions,以確保您沒有連接到不存在的IBOutlet或IBAction。 –

回答

11

我已經能夠解決我的問題(細節視圖控制器顯示延遲或應用程序甚至崩潰後顯示):

  dispatch_async(dispatch_get_main_queue(), ^(void) { 
      [self performSegueWithIdentifier: @"segue" sender: self]; 
     }); 
+2

作爲一個建議,永遠不要在一個不是主要的隊列中的UI相關的調用。 –

1

enter image description here我已經下載並從第一文本字段到用戶名和ID查看詳細視圖控制器你的故事板有和出口,但沒有IBOutlet中的代碼,刪除ID IBOutlet中在故事板

+0

好的,謝謝 - 但我仍然沒有使用這些插口(只需用'NSLog'打印數據)。這可能是一個線程問題 - 因爲我從Facebook回調中調用'performSegueWithIdentifier'? –

+0

沒有一切都很好,刪除插座,它像一個魅力 – savana