0

私はこれが好きだというセグエを持っています:

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

iPhoneでは動作しますが、iPadでは動作しません。私がしていることは、サーバーにリモート呼び出しを行うことです。サーバーの応答が正しく戻ってきたら、そのセグエを使用してユーザーを新しいページに誘導しようとします。

これはiPhoneシミュレーターでは機能しますが、iPadでは機能しません(識別文字列は両方で同じです)。iPadでは次のエラーでクラッシュします。

bool _WebTryThreadLock(bool), 0x68f9cb0: 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   WebThreadLock
2   -[UITextRangeImpl isEmpty]
3   -[UITextRange(UITextSelectionAdditions) _isCaret]
4   -[UITextSelectionView setCaretBlinks:]
5   -[UIKeyboardImpl setCaretBlinks:]
6   -[UIKeyboardImpl setDelegate:force:]
7   -[UIKeyboardImpl setDelegate:]
8   -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:]
9   -[UINavigationController navigationTransitionView:didStartTransition:]
10  -[UINavigationTransitionView transition:fromView:toView:]
11  -[UINavigationTransitionView transition:toView:]
12  -[UINavigationController _startTransition:fromViewController:toViewController:]
13  -[UINavigationController _startDeferredTransitionIfNeeded]
14  -[UINavigationController pushViewController:transition:forceImmediate:]
15  -[UINavigationController pushViewController:animated:]
16  -[UIStoryboardPushSegue perform]
17  -[UIStoryboardSegueTemplate perform:]
18  -[UIViewController performSegueWithIdentifier:sender:]
19  __41-[PlanBusinessController submitBusiness:]_block_invoke_0
20  __block_global_0
21  -[NSBlockOperation main]
22  -[__NSOperationInternal start]
23  -[NSOperation start]
24  __block_global_6
25  _dispatch_call_block_and_release
26  _dispatch_worker_thread2
27  _pthread_wqthread
28  start_wqthread

また、Obective-Cスタックトレースを読み取ることにあまり慣れていないため、問題が何であるかを特定するのに苦労しています。

これが私がこれを行う方法です:

- (IBAction)submitBusiness:(id)sender 
{    
     // Make a url to send

     NSURL *url = [NSURL URLWithString:full_encoded_url_string];
     NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

        // ***************
        // TODO: ok I dont really understand what this is
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        // **************

        [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
         {   
                         // I took out a lot of the logic code that is not needed

                         [self performSegueWithIdentifier:@"PlanToBusiness" sender:self];
         }];
    }
}
4

1 に答える 1

2

セグエを実行するときなど、UIに触れるメソッドでは、メインスレッドからそのコードを呼び出していることを確認することが重要です。これを行う最も簡単な方法は、次のようなメソッドを作成することです。

- (void)performPlanToBusinessSegueOnMainThread
{
    [self performSegueWithIdentifier:@"PlanToBusiness" sender:self];
}

次に、次のように、完成したブロックでこのメソッドを呼び出すことができます。

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {   
     // I took out a lot of the logic code that is not needed

     [self performSelectorOnMainThread:@selector(performPlanToBusinessSegueOnMainThread) 
                            withObject:nil 
                         waitUntilDone:YES];
 }];

少し遠回りですが、例外を修正する必要があります。メソッドを呼び出すだけでよいperformSegueWithIdentifierのですが、performSelectorOnMainThread引数が多すぎます。

于 2012-08-17T17:02:38.910 に答える