“ wait_fences: ไม่ได้รับคำตอบ: 10004003”?


94

ฉันได้รับข้อผิดพลาดที่เป็นความลับนี้ในครั้งแรก (และเป็นครั้งแรกเท่านั้น) มุมมองของฉันถูกโหลดเนื่องจากโค้ดบรรทัดต่อไปนี้:

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

มีความล่าช้าอย่างเห็นได้ชัด (~ 3 - 4 วินาทีแม้ในเครื่องจำลอง) เนื่องจากสิ่งนี้ทำให้แอปของฉันไม่ตอบสนอง ไม่มีใครรู้วิธีการที่จะแก้ไขปัญหานี้? ฉันไม่พบเอกสารใด ๆ บนเว็บไซต์ของ Apple หรือวิธีแก้ปัญหาใด ๆ ที่นี่หรือใน Google

น่าแปลกที่สถานการณ์ตรงข้ามจะเกิดขึ้นถ้าฉันใส่เส้นเข้าไป-viewDidAppear:แทนที่จะเป็น-viewWillAppear:; นั่นคือแทนที่จะพิมพ์ข้อผิดพลาดในครั้งแรกที่แสดงแป้นพิมพ์และไม่พิมพ์อีกครั้งข้อผิดพลาดจะไม่ถูกพิมพ์ในครั้งแรก แต่ทุกครั้งหลังจากนั้น นี่ทำให้ฉันปวดหัวมาก

คำตอบ:


103

แทนที่-viewDidAppear:ไม่และให้แน่ใจว่าการเรียกร้อง-viewWillAppear [super viewDidAppear:]คุณไม่ควรแสดงภาพเคลื่อนไหวเมื่อคุณไม่ได้อยู่บนหน้าจอ ("จะปรากฏขึ้น") และ-viewDidAppear:เอกสารอธิบายว่าคุณต้องโทรหาsuperเพราะพวกเขามีสิ่งที่ต้องทำ


สิ่งนี้ไม่ตอบสนองเท่าที่ฉันต้องการ (ยังคงมีความล่าช้าเล็กน้อยในการแสดงแป้นพิมพ์ทุกครั้ง) แต่ดูเหมือนว่าจะทำตามเคล็ดลับ
Michael

1
ฉันรู้ว่าความล่าช้าที่คุณกำลังพูดถึง ฉันเคยเห็นมันในหลายแอพ คุณอาจลองโทร -becomeFirstResponder ก่อน (แทนที่จะโทรตาม) - [super viewDidAppear:] ถ้าคุณยังไม่ได้โทร สิ่งนี้อาจไม่มีผลกระทบ แต่อาจทำให้ภาพเคลื่อนไหวเริ่มต้นในลูปเหตุการณ์เดียวกันแทนที่จะเป็นภาพถัดไป ฉันยังไม่ได้ทดลองเพื่อยืนยัน
Rob Napier

14
วิธีนี้ไม่สามารถแก้ไขปัญหาได้ หากคุณโยน UIAlertSheet ใน viewDidAppear หลังจากเรียก [super viewDidAppear: animated] คุณจะได้รับข้อความเดียวกันทุกครั้ง อย่างไรก็ตามหากคุณโยนมันขึ้นมาในภายหลังให้พูดตอบกลับ ibaction ก็ไม่มีปัญหา ดังนั้น performWithSelector น่าจะเป็นวิธีแก้ไขหรือคุณอาจเพิกเฉยต่อข้อความไม่ว่าวิธีนี้จะเป็นข้อบกพร่องของ SDK ไม่ใช่ปัญหากับรหัสของคุณ
Billy Gray

9
@Billy การโยน UIAlertSheet ก่อนที่ภาพเคลื่อนไหวจะเสร็จอาจทำให้เกิดปัญหาเดียวกัน ไม่ว่าในกรณีใดที่คุณวางแผ่นงานไว้ใน viewDidAppear อาจเร็วเกินไปและคุณควรใช้ performSelector: afterDelay: เพื่อผลักดัน UIAlertSheet ไปยังลูปถัดไป นั่นไม่ใช่ข้อบกพร่องใน SDK แม้ว่ารายละเอียดที่นี่จะมีเอกสารไม่ดีก็ตาม การแสดงภาพเคลื่อนไหวใน -viewWillAppear เป็นข้อบกพร่องในโค้ดดั้งเดิม ไม่ว่าในกรณีใดคุณไม่ควรเพิกเฉยต่อข้อความ อาจนำไปสู่สิ่งประดิษฐ์ที่เป็นภาพแปลก ๆ (การเลื่อนภาพเคลื่อนไหวไปด้านข้างแบบแปลก ๆ )
Rob Napier

4
@Michael ฉันได้ให้โซลูชั่นสำหรับการbecomeFirstResponderที่จะแสดงแป้นพิมพ์ได้ทันทีโดยไม่ชักช้า
ma11hew28

22

ฉันได้รับข้อผิดพลาดที่คล้ายกันเมื่ออย่างรวดเร็ว:

  1. การปิดมุมมองโมดอล
  2. กำลังอัปเดตมุมมองหลัก
  3. นำเสนอมุมมองโมดอลใหม่

ฉันสังเกตเห็นว่าฉันได้รับมันในเครื่องจำลองเท่านั้นไม่ใช่ในอุปกรณ์ นอกจากนี้ฉันกำลังติดอยู่ในวงวนที่ไม่มีที่สิ้นสุด

วิธีแก้ปัญหาของฉันคือชะลอการนำเสนอของมุมมองโมดอลใหม่ ดูเหมือนว่าการอัปเดตลำดับชั้นของมุมมองอย่างรวดเร็วทำให้เกิดสภาพการแข่งขันในโค้ดของ Apple

ด้วยเหตุนี้ให้ลองทำดังนี้:

     - (void)viewDidAppear:(BOOL)animated{

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

คุณอาจประสบปัญหาในการนำเสนอแป้นพิมพ์สำหรับ UITextField ที่ยังไม่ปรากฏบนหน้าจอ สิ่งนี้อาจทำให้เกิดปัญหาคล้ายกับของฉัน

นอกจากนี้คุณหยุดชั่วคราวเพื่อให้ลำดับชั้นมีเวลาอัปเดตก่อนที่จะนำเสนอแป้นพิมพ์ในกรณีนี้

หวังว่านี่จะช่วยได้


3
สำหรับปัญหาที่คุณพบเกี่ยวกับโมดอลคุณรอให้โมดอลปิดตัวลงก่อนที่จะนำเสนอโมดอลใหม่หรือไม่ แทนที่จะรอช่วงเวลาโดยพลการและหวังว่าจะเสร็จสมบูรณ์คุณสามารถทราบได้โดยการแทนที่ -viewDidDisappear ใน modalViewController ที่สามารถโทรกลับไปที่ -parentViewController ของ modal หรือสามารถโพสต์การแจ้งเตือน สิ่งสำคัญคือต้องเข้าใจว่าการขอให้ปิดบางสิ่งไม่ได้หมายความว่ามันจะหายไปและคุณไม่ควรทำให้สิ่งต่างๆเคลื่อนไหวทับกันโดยทั่วไป โดยทั่วไปแล้ว -viewWill / DidDisappear เป็นวิธีที่ดีที่สุดในการรู้ว่าเกิดอะไรขึ้น
Rob Napier

มุมมองกิริยาแรกคือตัวเลือกภาพถ่ายและฉันจัดการทุกอย่างภายในวิธีการโทรกลับของเครื่องมือเลือกรูปภาพ ถูกต้องฉันควรวางโค้ดเพื่อเปิดมุมมองโมดอลถัดไปภายใน viewDdiAppear นั่นเป็นวิธีการแก้ปัญหาที่ดีกว่าและมักจะแก้ไขปัญหาได้โดยไม่คำนึงถึงแพลตฟอร์ม
Corey Floyd

12

ตรวจสอบว่าคุณกำลังโต้ตอบกับ UI บนเธรดหลักเท่านั้น ฉันไปถึง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

(คุณสามารถปิดแถบสถานะได้จากไฟล์ plist ของแอปพลิเคชันแทน)


7

หลังจากการทดสอบสองสามครั้งกฎใหญ่คือ: "ห้ามแสดงภาพเคลื่อนไหวก่อนที่จะปิดการแสดงภาพเคลื่อนไหวหรือการแสดงแบบเคลื่อนไหว"

ตัวอย่างเช่น:

  • อย่าโทร-dismissModalViewControllerAnimated:YESหลังจากการเรียกกลับของคณะผู้แทน(รอให้มุมมองการแจ้งเตือนหายไปก่อนที่จะดำเนินการนี้โดยใช้การโทรกลับ)UIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex:
  • อย่าพยายามแสดงแป้นพิมพ์ ( becomeFirstResponder) ก่อนที่ตัวควบคุมมุมมองของคุณจะอยู่บนหน้าจอ

สิ่งเลวร้ายอาจเกิดขึ้น

หวังว่าจะเป็นประโยชน์นะครับ ;-)


ฉันใช้ clickedButtonAtIndex และจะสร้างฟิลด์ข้อความจำนวนมากก่อนที่การแจ้งเตือนจะถูกปิด การเปลี่ยนเป็น didDismissWithButtonIndex ช่วยกำจัดคำเตือนเหล่านั้นได้อย่างแน่นอน! ขอบคุณ!
Nitin Alabur

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ดังนั้นจึงไม่แน่ใจว่ามีการโหลดไฟล์ nib แล้ว ถ้าtextFieldเป็น IBOutlet ฉันคิดว่ามันจะเป็นศูนย์ในตอนนี้
Rob Napier

5

คุณได้ทำ [textfield becomeFirstResponder];

[textfield resignFirstResponder];และหลังจากที่คุณได้รับค่าจากฟิลด์ข้อความในรหัสของคุณทำ ที่จะช่วยคุณฉันคิดว่า


4

หากคุณใช้ iPhone Simulator 4.0 ปัจจุบันข้อความแสดงข้อผิดพลาดนี้จะปรากฏขึ้นบ่อยครั้งเมื่อหมุนหน้าจอ (หรือเมื่อเคลื่อนไหวหลังจากหมุนหน้าจอ) พร้อมกับความล่าช้า 1-2 วินาทีในภาพเคลื่อนไหว

เป็นข้อบกพร่องใน Simulator เวอร์ชันนี้และควรได้รับการแก้ไขในไม่ช้า


ขอบคุณสำหรับข้อมูลเกี่ยวกับข้อผิดพลาดของโปรแกรมจำลอง 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) ถูกสร้างขึ้นก่อนมุมมองระดับบนสุด / ระดับบนสุด" สิ่งนี้ไม่ควรเกิดขึ้นในโค้ดด้านบนใช่ไหม?
Michael

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 จะใช้เวลานานในการค้นหาข้อความดังนั้นการแจ้งเตือนจะแสดงขึ้นและข้อความ "wait_fences: ล้มเหลวในการรับการตอบกลับ: 10004003" จะปรากฏขึ้น

สำหรับฉันฉันต้องเพิ่มข้อความในไฟล์ Localizable.strings เท่านั้นและปัญหาของฉันได้รับการแก้ไข อาจเป็นเช่นนี้สำหรับเหตุการณ์อื่น ๆ หรือไม่?


1

ด้วย UIAlertView สิ่งที่แก้ไขได้สำหรับฉันคือการลาออกตามที่ระบุไว้ด้านล่างนี้

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

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

ผู้รับมอบสิทธิ์อื่น ๆ ของ UIAlertViewDelegate ไม่ได้แก้ไขปัญหา


1

ปัญหาคือมีเงื่อนไขการแข่งขันในรหัสของ Apple โดยปกติสิ่งนี้เกี่ยวข้องกับการอัปเดต UI ที่ไม่ถูกต้อง

จากประสบการณ์ของฉันคุณอาจไม่ได้เรียก super ใน viewDidAppear, viewWillAppear เป็นต้นหรือคุณพยายามแสดง UIAlertView ใน viewDidLoad หรือ viewWillAppear

เมื่อคุณเพิ่ม UIAlertView เฟรมเวิร์กจำเป็นต้องมีการอ้างอิงถึงมุมมองระดับบนสุดของคุณ แต่ถ้าคุณอยู่ใน viewWillAppear หรือ viewDidLoad มุมมองนั้นจะไม่แสดงขึ้นจริง ... คุณควรพิจารณาย้ายโค้ดไปที่ viewDidAppear ซึ่งมุมมองนั้นพร้อมที่จะใช้โดย UIAlertView


0

ช่องข้อความมีอยู่ในมุมมองนั้นหรืออยู่ภายในอย่างอื่น? คุณสามารถส่ง 'becomeFirstRepsonder' ไปยังสิ่งที่อยู่ในมุมมองนั้นโดยตรงเท่านั้น หากเก็บไว้ในส่วนประกอบวิดเจ็ตอื่น ๆ คุณไม่ควรตั้งค่าสถานะการตอบกลับแรกในวิดเจ็ตนี้ แต่ควรอยู่ในวิดเจ็ตที่กำลังสร้างขึ้น ตัวอย่างเช่นหากคุณกำลังเพิ่มช่องข้อความในมุมมองการแจ้งเตือนเนื่องจากการแสดงเกิดขึ้นแบบอะซิงโครนัสการแสดงอาจไม่พร้อมเมื่อคุณเรียกใช้ becomeFirstResponder (ตามหลักการแล้วคุณจะมีคลาสมุมมองการแจ้งเตือนของคุณเองและกำหนดฟิลด์ข้อความภายในนั้นและเมื่อมุมมองนั้นได้รับ viewDidAppear คุณจะตั้งค่าฟิลด์ข้อความเป็นผู้ตอบกลับคนแรก ณ จุดนั้น)


0

ฉันยังได้รับข้อความwait_fences: failed to receive reply: 10004003ของฉันviewWill...และviewDid...วิธีการทำอะไร superแต่ส่งข้อความไปยัง ในกรณีของฉันมันเกิดขึ้นเมื่อฉันมีการUIAlertViewแสดงในของฉันGameViewControllerและผู้ใช้กดปุ่มรอบอุปกรณ์ iPhone แทนแล้วกลับไปที่แอพ นี่ดูจากมือฉัน


0

ควรแสดง Alertview หรือ actionsheets บนเธรดหลัก ... ดังนั้นหากคุณทำการเชื่อมต่อแบบซิงโครนัสและดำเนินการกับเธรดอื่นและแสดงการแจ้งเตือนบนพื้นฐานของเอาต์พุตที่คุณได้รับจากการดำเนินการนั้นคุณจะได้รับข้อความแสดงข้อผิดพลาดนี้ wait_fences: ล้มเหลวในการ รับคำตอบ: 10004003. คุณสามารถทำสิ่งที่ชอบ ....

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

และแสดงการแจ้งเตือนในเมธอด handleOutput ผ่านสตริงการตอบสนองเอาต์พุตเป็นพารามิเตอร์


0

ทางออกอยู่ที่นี่!

ฉันมีข้อผิดพลาดเดียวกันตอนนี้ฉันได้รับการแก้ไขแล้วซึ่งอาจช่วยคุณได้

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.