"Wait_fences: उत्तर प्राप्त करने में विफल: 10004003"?


94

मुझे पहली बार (और केवल पहली बार) यह गुप्त त्रुटि मिली है, मेरा विचार कोड की निम्न पंक्ति के कारण भरा हुआ है:

- (void)viewWillAppear:(BOOL)animated
{
    [textField becomeFirstResponder];
}

ध्यान देने योग्य है (~ 3 - 4 सेकंड, यहां तक ​​कि सिम्युलेटर पर भी) इस वजह से देरी होती है जिससे मेरा ऐप अप्रतिसादी महसूस होता है। क्या कोई जानता है कि इसे कैसे ठीक करें? मुझे Apple की साइट पर, या यहाँ या Google पर कोई भी समाधान नहीं मिल रहा है।

अजीब तरह से, विपरीत स्थिति होती है अगर मैं -viewDidAppear:इसके बजाय लाइन डालता हूं -viewWillAppear:; है कि, बजाय त्रुटि केवल पहली बार कीबोर्ड दिखाया गया है और फिर कभी नहीं किया गया है मुद्रण की, त्रुटि है नहीं पहली बार लेकिन बाद हर बार छपी। यह मेरे लिए एक बड़ा सिरदर्द बन रहा है।

जवाबों:


103

ओवरराइड -viewDidAppear:, नहीं -viewWillAppear, और कॉल करना सुनिश्चित करें [super viewDidAppear:]। जब आप स्क्रीन पर नहीं होते हैं, तो आपको एनिमेशन नहीं करना चाहिए ("दिखाई देगा")। और -viewDidAppear:डॉक्स समझाते हैं कि आपको कॉल करना होगा superक्योंकि उनके पास करने के लिए अपनी चीजें हैं।


यह उतना उत्तरदायी नहीं है जितना मैं चाहूंगा (हर बार कीबोर्ड दिखाने में थोड़ी देरी होती है), लेकिन ऐसा लगता है कि यह चाल है।
माइकल

1
मुझे पता है कि तुम किस बारे में बात कर रहे हो। मैंने इसे बहुत सारे ऐप्स में देखा है। यदि आप पहले से ही नहीं हैं, तो आप कॉलिंग -BomeomeFirstResponder को कॉल करने की कोशिश कर सकते हैं - [सुपर व्यूडिडऐपियर]]। इसका कोई प्रभाव नहीं हो सकता है, लेकिन अगले एक के बजाय एक ही घटना लूप में एनीमेशन शुरू हो सकता है। मैंने इसकी पुष्टि करने के लिए अभी तक प्रयोग नहीं किया है।
रोब नेपियर

14
यह समस्या को ठीक नहीं करता है। यदि आप UIDlertSheet को viewDidAppear में फेंकते हैं, तो [सुपर viewDidAppear: एनिमेटेड] को कॉल करने के बाद, आप हर बार एक ही संदेश के साथ समाप्त होते हैं। यदि, हालांकि, आप इसे बाद में फेंक देते हैं, तो एक ibaction की प्रतिक्रिया में कहते हैं, कोई समस्या नहीं है। बहुत अच्छा प्रदर्शन शायद ठीक करने का तरीका है, या आप संदेश को अनदेखा कर सकते हैं, या तो यह एसडीके बग प्रतीत होता है, आपके कोड के साथ कोई समस्या नहीं है।
बिली ग्रे

9
@ बिली, एनिमेशन किए जाने से पहले एक UIAlertSheet को फेंकने से वही समस्या हो सकती है। किसी भी मामले में आप viewDidAppear के अंदर एक शीट डाल रहे हैं शायद बहुत जल्दी है और आपको शायद परफॉर्मर का उपयोग करना चाहिए: afterDelay: UIAlertSheet को अगले लूप पर पुश करने के लिए। यह एसडीके में बग नहीं है, हालांकि यहां विवरण खराब रूप से प्रलेखित हैं। एनिमेशन का प्रदर्शन -viewWillAppear मूल कोड में बग था। किसी भी स्थिति में, आपको संदेश को अनदेखा नहीं करना चाहिए। यह अजीब दृश्य कलाकृतियों (एनीमेशन का एक अजीब बग़ल में फिसलने) का कारण बन सकता है।
रोब नेपियर


22

मुझे जल्दी से एक समान त्रुटि मिल रही थी:

  1. एक मोडल दृश्य को खारिज कर रहा है
  2. मुख्य दृश्य को अद्यतन करना
  3. एक नया मोडल दृश्य प्रस्तुत कर रहा है

मैंने देखा कि मैं केवल सिम्युलेटर में इसे प्राप्त कर रहा था और डिवाइस पर नहीं। इसके अतिरिक्त, मैं एक अनंत लूप में फंस रहा था।

मेरा समाधान नए मोडल दृश्य को प्रस्तुत करने में देरी करना था। ऐसा लगता है कि दृश्य पदानुक्रम को जल्दी से अपडेट करने से ऐप्पल के कोड में दौड़ की स्थिति में कुछ गिरावट आई।

इसे ध्यान में रखते हुए, यह प्रयास करें:

     - (void)viewDidAppear:(BOOL)animated{

            [super viewDidAppear:animated];
            [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
  }

आपके पास UITextField के लिए कीबोर्ड प्रस्तुत करने वाले मुद्दे हो सकते हैं जो अभी तक स्क्रीन पर नहीं हैं। यह मेरी जैसी समस्याओं का कारण हो सकता है।

इसके अलावा, आप कीबोर्ड को प्रस्तुत करने से पहले अद्यतन करने के लिए पदानुक्रम समय देते हैं, बस मामले में।

उम्मीद है की यह मदद करेगा।


3
जिन मुद्दों पर आप मॉडल्स के साथ थे, क्या आपने नए मोडल को पेश करने से पहले मोडल को खत्म करने का इंतजार किया था? समय की एक मनमाना अवधि प्रतीक्षा करने और इसे पूरा करने की अपेक्षा करने के बजाय, आप modalViewController में -viewDidDisappear को ओवरराइड करके जान सकते हैं। यह मोडल के -parentViewController पर वापस कॉल कर सकता है, या एक अधिसूचना पोस्ट कर सकता है। यह समझना महत्वपूर्ण है कि किसी चीज को खारिज करने का मतलब यह नहीं है कि यह अभी तक चला गया है, और आपको सामान्य रूप से एक दूसरे के ऊपर चीजों को चेतन नहीं करना चाहिए। -व्यूवेल / डिडिसैपियर आम तौर पर आपके लिए सबसे अच्छा तरीका है यह जानने के लिए कि चीजें कब होती हैं।
रोब नेपियर

पहला मोडल दृश्य फोटो पिकर था, और मैं फोटो पिकर कॉल बैक पद्धति के भीतर सब कुछ संभालता हूं। आपका अधिकार, मेरे पास अगले मोडल दृश्य को देखने के लिए कोड देखने के लिए कोड होना चाहिए। यह एक बेहतर समाधान है और मंच की परवाह किए बिना समस्या को ठीक करेगा।
कोरी फ्लोयड

12

जांचें कि आप केवल मुख्य धागे पर यूआई के साथ बातचीत कर रहे हैं। मुझे मिल गया wait_fences: failed to receive reply: 10004003, जबकि मैं वहां बैठा हुआ था एक UIAlertView 5 के बारे में सेकंड के लिए दिखाने के लिए है क्योंकि प्रासंगिक कोड एक पृष्ठभूमि धागे पर मार डाला गया था इंतज़ार कर रहे। आप अपने कोड को ब्लॉक में डालकर और मुख्य धागे में भेजकर सुनिश्चित कर सकते हैं:

dispatch_async(dispatch_get_main_queue(), ^{
    if (!success) {
        // Inform user that import failed
        UIAlertView * importFailedAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ErrorTitle5", @"Import failed") 
                                                                     message:NSLocalizedString(@"Error5", @"Something went wrong") 
                                                                    delegate:nil 
                                                           cancelButtonTitle:NSLocalizedString(@"OK", nil) 
                                                           otherButtonTitles:nil];
        [importFailedAlert show];
    }
});

9

सब कुछ आज़माने के बाद मैं Google पर काम कर पाया और इसमें से कोई भी काम नहीं कर सका, यही मेरे लिए समस्या का हल है। कुंजी यह है कि मैं यह सामान willDismissWithButtonIndex प्रतिनिधि विधि में कर रहा हूं। इससे पहले कि मैं इसे कहीं और कर रहा था।

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
    [myTextField resignFirstResponder];
    [myTextField removeFromSuperview];  
    [myTextField release];  
}

8

यदि आपके पास viewDidLoad में निम्न पंक्ति है, तो यह इस संदेश का कारण बन सकता है। निम्नलिखित पंक्ति टिप्पणी करें।

[[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented

(आप इसके बजाय एप्लिकेशन प्लिस्ट फ़ाइल से स्थिति बार को अक्षम कर सकते हैं)।


7

कुछ परीक्षणों के बाद बड़ा नियम यह है: "एनिमेटेड बर्खास्तगी या एनिमेटेड शो से पहले एनीमेशन न करें।"

उदाहरण के लिए:

  • -dismissModalViewControllerAnimated:YESप्रतिनिधि कॉलबैक के बाद कॉल न करें ( कॉलबैक का उपयोग करने से पहले अलर्ट दृश्य से बाहर फीका करें )UIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex:
  • becomeFirstResponderस्क्रीन पर आपके व्यू कंट्रोलर से पहले कीबोर्ड ( ) दिखाने की कोशिश न करें ।

बुरी बातें हो सकती हैं।

आशा है कि यह उपयोगी होगा ;-)


मैं clickedButtonAtIndex का उपयोग कर रहा था, और अलर्ट को खारिज करने से पहले टेक्स्टफील्ड को आबाद करने का एक गुच्छा करेगा। इसे करने के लिए स्विच किया गयाडिस्मिसविथ बॉटनइंडेक्स ने निश्चित रूप से उन चेतावनियों से छुटकारा पाने में मदद की! धन्यवाद!
नितिन अलबुर

5

इसने मुझे एनीमेशन या देरी के बिना कीबोर्ड को तुरंत दिखाने के लिए काम किया।

आज्ञा textFieldदेना एक उदाहरण के चर MyViewController(एक उपवर्ग UIViewController)।

कॉल [textField becomeFirstResponder]में initWithNibName:bundle:(का एक उपवर्ग के लिए UIViewController) या initWithStyle:(के एक उपवर्ग के लिए UITableViewController), में नहीं viewDidLoad। उदाहरण के लिए:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [textField becomeFirstResponder];
    }
    return self;
}

या, इसे प्रारंभ करने के बाद ही कॉल करें लेकिन पुश करने से पहले UIViewController। उदाहरण के लिए:

MyViewController *viewController = [[MyViewController alloc] init];
[viewController.textField becomeFirstResponder];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

दिलचस्प। क्या आप सुनिश्चित हैं कि यह हर समय काम करता है? मेरी चिंता यह है कि आप संदर्भ नहीं देते हैं view, इसलिए यह निश्चित नहीं है कि निब फ़ाइल लोड की गई है। अगर textFieldएक IBOutlet है, तो मुझे लगता है कि यह इस बिंदु पर शून्य होगा।
रोब नेपियर

5

तुमने किया हैं [textfield becomeFirstResponder];

और जब आप अपने कोड में टेक्स्टफील्ड से मूल्य प्राप्त करें, तब करें [textfield resignFirstResponder];। मुझे लगता है कि आपकी मदद करेगा।


4

यदि आप वर्तमान iPhone सिम्युलेटर 4.0 चला रहे हैं, तो यह त्रुटि संदेश स्क्रीन को घुमाते समय अक्सर दिखाई देता है (या स्क्रीन को घुमाने के बाद एनिमेट करते समय) एनिमेशन में 1-2 सेकंड के अंतराल के साथ।

यह सिम्युलेटर के इस संस्करण में एक बग है और इसे जल्द ही ठीक किया जाना चाहिए।


iOS4 सिम्युलेटर बग के बारे में जानकारी के लिए धन्यवाद। इसी परियोजना के लिए, wait_fencesसंदेश 3.1 सिम्युलेटर
ओहो

3

और अधिक जानकारी के लिए यहां देखें: http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html

आपकी समस्या संबंधित है।


मदद के लिए धन्यवाद, लेकिन दुर्भाग्य से मैं उस पेज पर अपनी समस्या का हल नहीं ढूंढ सकता। "यह तब प्रतीत होता है जब एक सबव्यू (जैसे। UIAlertView) को उसके माता-पिता / सुपर व्यू से पहले बनाया जाता है।" यह उपरोक्त कोड में नहीं होना चाहिए, है ना?
माइकल

3

ओवरराइड viewDidappear, नहीं viewWillAppear:

-(void) viewDidAppear:(BOOL) animated
{
 [super viewDidAppear:animated];
 [myTextField becomeFirstResponder];
}

3

मैं इस UIAlertView कोड के माध्यम से एक-के-बाद-एक अनुकरण कर सकता हूं।

   UIAlertView *alert = [[UIAlertView alloc]
                   initWithTitle:NSLocalizedString(@"defineTitle",@"defineTitle")
                         message:NSLocalizedString(@"defineBody", @"defineBody")
                        delegate:self
               cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok")
               otherButtonTitles:nil];
   [alert show];

जब NSLocalizedString को Localizable.strings फ़ाइल में परिभाषित नहीं किया जाता है, तो इसे ग्रंथों की खोज करने में लंबा समय लगेगा, इसलिए अलर्ट दिखाएगा और "प्रतीक्षा_फेंस: उत्तर प्राप्त करने में विफल रहा: 10004003" दिखाया जाएगा।

मेरे लिए मुझे केवल ग्रंथों को Localizable.strings फ़ाइलों में जोड़ना था और मेरी समस्याओं को हल किया गया था। शायद यह अन्य घटनाओं के लिए भी मामला है?


1

इसके अलावा UIAlertView के साथ। मेरे लिए इसका हल क्या है जैसा कि नीचे उल्लेख किया गया था, जैसा कि वेयरहाउससेल ने पहले उल्लेख किया था।

- (void)didPresentAlertView:(UIAlertView *)alertView
{
    [txtListingPassword becomeFirstResponder];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [txtListingPassword resignFirstResponder];
}

UIAlertViewDelegate के अन्य प्रतिनिधियों ने समस्या को ठीक नहीं किया।


1

समस्या यह है कि एप्पल के कोड में एक दौड़ की स्थिति है। आमतौर पर, यह गलत यूआई अपडेट के साथ कुछ करना है।

मेरे अनुभव में, आपने या तो viewDidAppear, viewWillAppear आदि में सुपर को नहीं बुलाया है या आप viewDidLoad या viewWillAppear में UIAlertView प्रदर्शित करने का प्रयास करते हैं।

जब आप एक UIAlertView जोड़ते हैं, तो रूपरेखा को आपके मूल दृश्य के संदर्भ की आवश्यकता होती है। लेकिन अगर आप व्यूप्लेयर या व्यूडीडलड में हैं, तो दृश्य वास्तव में प्रदर्शित नहीं होता है ... आपको कोड को देखने के लिए स्थानांतरित करना चाहिए जहां दृश्य यूआईईएलर्ट व्यू द्वारा उपयोग किए जाने के लिए तैयार है।


0

क्या टेक्स्ट फ़ील्ड उस दृश्य के भीतर, या कुछ और के भीतर समाहित है? आप केवल 'beFirstRepsonder' को उस चीज़ के लिए भेज सकते हैं, जो सीधे उस दृश्य में निहित है। यदि इसे किसी अन्य विजेट घटक में संग्रहीत किया जाता है, तो आपको इस विजेट में पहला उत्तरदाता स्थिति सेट नहीं करना चाहिए, बल्कि उस विजेट में बनाया जाना चाहिए। उदाहरण के लिए, यदि आप टेक्स्ट फ़ील्ड को एक अलर्ट दृश्य में जोड़ रहे हैं, क्योंकि शो एसिंक्रोनस रूप से होता है, तो यह उस समय तक नहीं हो सकता है जब आप कॉल हो जाते हैं। (आदर्श रूप में, आपके पास अपना अलर्ट व्यू क्लास होगा और उसके भीतर टेक्स्ट फील्ड को परिभाषित करेगा, और जब वह व्यू व्यूडीडऐपयर प्राप्त करेगा, तो आप टेक्स्टफील्ड को उस बिंदु पर पहले उत्तरदाता के रूप में सेट करेंगे।)


0

मुझे भी संदेश मिलता है wait_fences: failed to receive reply: 10004003और मेरे viewWill...और viewDid...तरीके कुछ नहीं करते बल्कि संदेश भेजते हैं super। मेरे मामले में ऐसा तब होता है जब मेरे पास एक UIAlertViewशो होता है GameViewControllerऔर उपयोगकर्ता इसके बजाय iPhone राउंड डिवाइस बटन दबाता है और फिर ऐप पर लौटता है। यह मेरे हाथ से निकलता है।


0

अलर्ट या एक्टशीट्स को मुख्य थ्रेड्स पर दिखाया जाना चाहिए ... इसलिए यदि आपका कोई समकालिक कनेक्शन बना रहा है और उस ऑपरेशन से प्राप्त आउटपुट के आधार पर आप किसी अन्य थ्रेड और शोइन अलर्ट पर उस ऑपरेशन को कर रहे हैं, तो आपको यह त्रुटि संदेश मिल जाएगा Wait_fences: विफल उत्तर प्राप्त करें: 10004003 आप कुछ ऐसा कर सकते हैं ...।

[self performSelectotOnMainThread:@selector(handleOutput:) withObject:output waitUntilDone:YES/NO];

और पैरामीटर के रूप में आउटपुट रिस्पांस स्ट्रिंग को पारित करने के लिए हैंडऑउटपुट विधि में अलर्ट दिखाते हैं।


0

समाधान यहाँ है!

मेरे पास एक ही त्रुटि थी, अब मुझे समाधान मिल गया है, इससे आपको मदद मिल सकती है।

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.