“Wait_fences: không nhận được trả lời: 10004003”?


94

Tôi gặp lỗi khó hiểu này lần đầu tiên (và chỉ lần đầu tiên) chế độ xem của tôi được tải do dòng mã sau:

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

Có một độ trễ đáng chú ý (~ 3 - 4 giây, ngay cả trên trình mô phỏng) do điều này khiến ứng dụng của tôi không phản hồi. Có ai biết làm thế nào để sửa lỗi này? Tôi không thể tìm thấy bất kỳ tài liệu nào về nó trên trang web của Apple hoặc bất kỳ giải pháp nào tại đây hoặc trên Google.

Thật kỳ lạ, tình huống ngược lại xảy ra nếu tôi đặt dòng vào -viewDidAppear:thay vì -viewWillAppear:; có nghĩa là, thay vì chỉ in lỗi lần đầu tiên bàn phím được hiển thị và không bao giờ lặp lại, lỗi không được in lần đầu tiên mà là mọi lần sau. Điều này đang khiến tôi rất đau đầu.

Câu trả lời:


103

Ghi đè -viewDidAppear:, không -viewWillAppear, và đảm bảo gọi[super viewDidAppear:] . Bạn không nên thực hiện hoạt ảnh khi bạn không ở trên màn hình ("sẽ xuất hiện"). Và các -viewDidAppear:tài liệu giải thích rằng bạn phải gọi supervì họ có những việc riêng phải làm.


Điều này không phản hồi như tôi mong muốn (vẫn có một chút độ trễ khi hiển thị bàn phím mỗi lần), nhưng nó có vẻ là một mẹo nhỏ.
Michael

1
Tôi biết độ trễ mà bạn đang nói đến. Tôi đã thấy nó trong rất nhiều ứng dụng. Bạn có thể thử gọi -becomeFirstResponder trước (thay vì sau) gọi - [super viewDidAppear:] nếu bạn chưa gọi. Điều này có thể không có tác động, nhưng có thể khiến hoạt ảnh bắt đầu trong cùng một vòng lặp sự kiện hơn là vòng tiếp theo. Tôi chưa thử nghiệm điều này để xác nhận.
Rob Napier

14
Điều này không khắc phục được sự cố. Nếu bạn ném một UIAlertSheet trong viewDidAppear, sau khi gọi [super viewDidAppear: animation], bạn luôn nhận được cùng một thông báo. Tuy nhiên, nếu bạn ném nó lên sau đó, hãy nói để đáp lại một ibaction, không vấn đề gì. vì vậy, performanceWithSelector có thể là cách để khắc phục hoặc bạn có thể bỏ qua thông báo, theo cách này, đây có vẻ là lỗi SDK chứ không phải vấn đề với mã của bạn.
Billy Grey

9
@Billy, việc ném UIAlertSheet lên trước khi hoạt ảnh được thực hiện có thể gây ra vấn đề tương tự. Trong mọi trường hợp, bạn đang đặt một trang tính bên trong viewDidAppear có lẽ là quá sớm và bạn có thể nên sử dụng PerformSelector: afterDelay: để đẩy UIAlertSheet sang vòng lặp tiếp theo. Đó không phải là một lỗi trong SDK, mặc dù các chi tiết ở đây được ghi chép kém. Thực hiện hoạt ảnh trong -viewWillAppear là lỗi trong mã gốc. Trong cả hai trường hợp, bạn không nên bỏ qua thông báo. Nó có thể dẫn đến các hiện vật thị giác kỳ lạ (hình ảnh động trượt sang một bên kỳ lạ).
Rob Napier


22

Tôi đã gặp lỗi tương tự khi nhanh chóng:

  1. Loại bỏ chế độ xem phương thức
  2. Cập nhật chế độ xem chính
  3. Trình bày một chế độ xem phương thức mới

Tôi nhận thấy rằng tôi chỉ nhận được nó trong trình mô phỏng chứ không phải trên thiết bị. Ngoài ra, tôi đã bị mắc vào một vòng lặp vô hạn.

Giải pháp của tôi là trì hoãn việc trình bày chế độ xem phương thức mới. Có vẻ như việc cập nhật nhanh hệ thống phân cấp chế độ xem đã gây ra một số tình trạng chạy đua trong mã của Apple.

Với suy nghĩ đó, hãy thử điều này:

     - (void)viewDidAppear:(BOOL)animated{

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

Có thể bạn đang gặp sự cố khi trình bày bàn phím cho một UITextField chưa xuất hiện trên màn hình. Điều này có thể gây ra các vấn đề tương tự như của tôi.

Ngoài ra, bạn tạm dừng để hệ thống phân cấp có thời gian cập nhật trước khi trình bày bàn phím, đề phòng.

Hi vọng điêu nay co ich.


3
Đối với các vấn đề bạn đang gặp phải với các phương thức, bạn có đợi phương thức hoàn tất việc loại bỏ trước khi trình bày phương thức mới không? Thay vì đợi một khoảng thời gian tùy ý và hy vọng nó đã hoàn tất, bạn có thể biết bằng cách ghi đè -viewDidDisappear trong modalViewController. Điều đó có thể gọi lại -parentViewController của modal hoặc có thể đăng thông báo. Điều quan trọng là phải hiểu rằng yêu cầu một thứ gì đó loại bỏ không có nghĩa là nó đã biến mất và nói chung bạn không nên làm động những thứ chồng lên nhau. -viewWill / DidDisappear nói chung là cách tốt nhất để bạn biết chắc chắn về thời điểm xảy ra sự việc.
Rob Napier 11/09/09

Chế độ xem phương thức đầu tiên là bộ chọn ảnh và tôi xử lý mọi thứ trong phương thức gọi lại bộ chọn ảnh. Quyền của bạn, tôi nên đặt mã để khởi chạy chế độ xem phương thức tiếp theo trong viewDdiAppear. đó là một giải pháp tốt hơn và rất có thể sẽ khắc phục được sự cố bất kể nền tảng nào.
Corey Floyd

12

Kiểm tra xem bạn chỉ tương tác với giao diện người dùng trên chuỗi chính. Tôi đã wait_fences: failed to receive reply: 10004003ngồi đó chờ UIAlertView hiển thị trong khoảng 5 giây vì mã có liên quan được thực thi trên một chuỗi nền. Bạn có thể đảm bảo bằng cách đặt mã của mình vào khối và gửi nó đến chuỗi chính:

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

Sau khi thử mọi thứ tôi có thể tìm thấy trên Google và không có cách nào hoạt động, đây là những gì đã giải quyết vấn đề cho tôi. Điều quan trọng là tôi đang thực hiện công cụ này trong phương thức ủy nhiệm willDismissWithButtonIndex. Trước khi tôi làm điều đó ở nơi khác.

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

8

Nếu bạn có dòng sau trong viewDidLoad, nó có thể gây ra thông báo này. Bình luận dòng sau.

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

(Thay vào đó, bạn có thể tắt thanh trạng thái từ tệp danh sách ứng dụng).


7

Sau một vài thử nghiệm, quy tắc lớn là: "Không trình diễn hoạt hình trước khi sa thải hoặc chương trình hoạt hình.".

Ví dụ:

  • không gọi -dismissModalViewControllerAnimated:YESsau khi ủy quyền gọi lại của an (đợi tắt chế độ xem cảnh báo trước khi thực hiện việc này bằng cách sử dụngUIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex: gọi lại)
  • không cố gắng hiển thị bàn phím ( becomeFirstResponder) trước khi bộ điều khiển chế độ xem của bạn hiển thị trên màn hình.

Những điều tồi tệ có thể xảy ra.

Hy vọng nó sẽ hữu ích ;-)


Tôi đang sử dụng clickButtonAtIndex và sẽ điền vào một loạt trường văn bản trước khi chế độ xem cảnh báo bị loại bỏ. Chuyển nó sang didDismissWithButtonIndex chắc chắn đã giúp loại bỏ những cảnh báo đó! Cảm ơn!
Nitin Alabur

5

Điều này đã giúp tôi làm cho bàn phím tự hiển thị ngay lập tức, không có hoạt ảnh hoặc độ trễ.

Hãy textFieldlà một biến thể hiện của MyViewController(một lớp con của UIViewController).

Gọi [textField becomeFirstResponder]vào initWithNibName:bundle:(cho một lớp con của UIViewController) hoặc initWithStyle:(cho một lớp con của UITableViewController), không phải trong viewDidLoad. Ví dụ:

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

Hoặc, gọi nó ngay sau khi khởi tạo nhưng trước khi đẩy UIViewController. Ví dụ:

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

Hấp dẫn. Bạn có chắc điều này hoạt động mọi lúc? Mối quan tâm của tôi là bạn không tham chiếu view, vì vậy không chắc chắn rằng tệp nib đã được tải. Nếu textFieldlà một IBOutlet, thì tôi nghĩ nó sẽ là con số không vào thời điểm này.
Rob Napier

5

Bạn đã làm [textfield becomeFirstResponder];

Và sau khi bạn nhận được giá trị từ trường văn bản trong mã của mình, hãy làm [textfield resignFirstResponder];. Điều đó sẽ giúp bạn, tôi nghĩ.


4

Nếu bạn đang chạy iPhone Simulator 4.0 hiện tại, thông báo lỗi này xuất hiện thường xuyên khi xoay màn hình (hoặc khi hoạt ảnh sau khi xoay màn hình) kèm theo độ trễ 1-2 giây trong hoạt ảnh.

Đây là một lỗi trong phiên bản Trình mô phỏng này và sẽ sớm được sửa.


cảm ơn vì thông tin về lỗi giả lập iOS4. cho cùng một dự án, wait_fencesthông báo không hiển thị trong trình mô phỏng 3.1
ohho

3

Cảm ơn sự giúp đỡ, nhưng rất tiếc, tôi không thể tìm thấy giải pháp cho vấn đề của mình trên trang đó. "Nó dường như xảy ra khi một chế độ xem phụ (ví dụ: UIAlertView) được tạo trước chế độ xem chính / siêu cấp của nó." Điều này sẽ không xảy ra trong đoạn mã trên, phải không?
Michael

3

ghi đè viewDidappear, không phải viewWillAppear:

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

3

Tôi có thể mô phỏng điều này một đối một bằng mã UIAlertView này.

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

Khi NSLocalizedString không được xác định trong tệp Localizable.strings, sẽ mất nhiều thời gian để tìm kiếm văn bản, do đó, cảnh báo sẽ hiển thị và “wait_fences: không nhận được trả lời: 10004003” sẽ được hiển thị.

Đối với tôi, tôi chỉ phải thêm văn bản vào tệp Localizable.strings và vấn đề của tôi đã được giải quyết. Có lẽ đây cũng là trường hợp của những điều kỳ lạ khác?


1

Cũng với UIAlertView. Điều đã giải quyết cho tôi là có đơn từ chức như bên dưới, như Warehouselabs đã đề cập trước đó.

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

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

Các đại diện khác của UIAlertViewDelegate đã không khắc phục được sự cố.


1

Vấn đề là có một điều kiện chạy đua trong mã của Apple. Thông thường, điều này liên quan đến các bản cập nhật giao diện người dùng không chính xác.

Theo kinh nghiệm của tôi, bạn có thể chưa gọi siêu trong viewDidAppear, viewWillAppear, v.v. Hoặc bạn cố gắng hiển thị một UIAlertView trong viewDidLoad hoặc viewWillAppear.

Khi bạn thêm một UIAlertView, khung công tác cần tham chiếu đến chế độ xem chính của bạn. Nhưng nếu bạn đang ở viewWillAppear hoặc viewDidLoad, chế độ xem không thực sự được hiển thị ... Bạn nên xem xét di chuyển mã sang viewDidAppear nơi chế độ xem đã sẵn sàng được sử dụng bởi UIAlertView.


0

Trường Văn bản được chứa trong dạng xem đó hay trong một cái gì đó khác? Bạn chỉ có thể gửi 'trở thànhFirstRepsonder' đến một cái gì đó được chứa trực tiếp trong chế độ xem đó. Nếu nó được lưu trữ trong một số thành phần tiện ích con khác, bạn không nên đặt trạng thái người phản hồi đầu tiên trong tiện ích con này, mà là trong tiện ích con đang được tạo. Ví dụ: nếu bạn đang thêm trường văn bản vào dạng xem cảnh báo, bởi vì chương trình diễn ra không đồng bộ, nó có thể không hoạt động vào thời điểm bạn gọi trở thành Trở thành phản hồi đầu tiên. (Lý tưởng nhất là bạn có lớp dạng xem cảnh báo của riêng mình và xác định trường văn bản trong đó, và khi dạng xem đó nhận được viewDidAppear, bạn sẽ đặt trường văn bản làm phản hồi đầu tiên tại thời điểm đó.)


0

Tôi cũng nhận được tin nhắn wait_fences: failed to receive reply: 10004003và của tôi viewWill...viewDid...các phương pháp không làm gì khác ngoài việc gửi tin nhắn đến super. Trong trường hợp của tôi, điều đó xảy ra khi tôi có màn hình UIAlertViewhiển thị GameViewControllervà người dùng thay vào đó nhấn vào nút tròn thiết bị iPhone và sau đó quay lại ứng dụng. Điều này có vẻ ngoài tầm tay của tôi.


0

Chế độ xem cảnh báo hoặc bảng hành động phải được hiển thị trên chuỗi chính ... vì vậy nếu bạn thực hiện bất kỳ kết nối đồng bộ nào và thực hiện thao tác đó trên một chuỗi khác và hiển thị cảnh báo trên cơ sở kết quả bạn nhận được từ hoạt động đó thì bạn sẽ nhận được thông báo lỗi này wait_fences: không thành công nhận được trả lời: 10004003. Bạn có thể làm điều gì đó như ...

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

và hiển thị các cảnh báo trong phương thức handleOutput chuyển chuỗi phản hồi đầu ra làm tham số.


0

Giải pháp là ở đây!

Tôi đã gặp lỗi tương tự, bây giờ tôi đã có giải pháp, điều này có thể giúp bạn.

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.