Độ trễ / độ trễ siêu chậm trên hình động bàn phím ban đầu của UITextField


169

Được rồi, vấn đề này đã khiến tôi phát điên.

Mất khoảng 3-4 giây để bàn phím bật lên sau khi tôi chạm vào UITextField. Điều này chỉ xảy ra vào lần đầu tiên bàn phím bật lên kể từ khi ứng dụng khởi chạy, sau đó hoạt ảnh bắt đầu ngay lập tức.

Lúc đầu, tôi nghĩ đó là vấn đề tải quá nhiều hình ảnh, hoặc của tôi UITableView, nhưng tôi chỉ tạo ra một dự án hoàn toàn mới chỉ với một UITextField, và tôi vẫn gặp vấn đề này. Tôi đang sử dụng iOS 5, Xcode ver 4.2 và đang chạy trên iPhone 4S.

Đây là mã của tôi:

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 280, 30)];
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.delegate = self;
    [self.view addSubview:textField];
}

@end

Đây có phải là một vấn đề phổ biến cho tất cả các ứng dụng?

Ngay bây giờ, cách duy nhất tôi có thể làm cho nó tốt hơn một chút là bằng cách textFieldtrở thành / từ chức trả lời đầu tiên viewDidAppear, nhưng điều đó không giải quyết được vấn đề hoàn toàn - nó chỉ tải độ trễ vào khi chế độ xem thay vào đó. Nếu tôi nhấp vào textFieldngay lập tức khi chế độ xem tải, tôi vẫn gặp sự cố; nếu tôi đợi 3-4 giây sau khi tải chế độ xem trước khi chạm vào TextField, tôi sẽ không bị trễ.

Câu trả lời:


291

Trước khi bạn thực hiện bất kỳ bản hack kỳ lạ nào để khắc phục sự cố này, hãy thử điều này: dừng phiên gỡ lỗi, đóng ứng dụng khỏi đa nhiệm, rút ​​thiết bị của bạn khỏi máy tính và chạy ứng dụng bình thường bằng cách nhấn vào biểu tượng của nó. Tôi đã thấy ít nhất hai trường hợp trong đó độ trễ chỉ xảy ra trong khi thiết bị được cắm.


2
Đây là câu trả lời đúng trong trường hợp của tôi trên iPhone 5 chạy iOS 8.1 - Tôi đã gặp phải sự chậm trễ 1 giây cho bàn phím đầu tiên.
bejonbee 16/1/2015

7
Đúng, lagg chỉ xảy ra khi gỡ lỗi. Kỳ dị.
Pauls

16
Cảm ơn bạn. Sự cố này vẫn còn trên iOS 9.1 / Xcode 7.1, Swift 2.1.
Yaroslav

4
FYVM Apple, FYVM. 90 phút về thời hạn mà tôi không đủ khả năng. 20 upvote nếu tôi có thể. Vẫn hiện diện trong iOS9.2 / Xcode 7.2
BaseZen

1
Đây chính xác là vấn đề của tôi. Sau khi tôi rút phích cắm từ máy mac của mình, không có độ trễ (ios9) xcode 7.2
Không được chấp nhận Darren

148

Vì vậy, vấn đề KHÔNG chỉ giới hạn ở lần cài đặt đầu tiên như tôi đã nghĩ trước đây, mà xảy ra mỗi khi ứng dụng được khởi chạy. Đây là giải pháp của tôi giải quyết vấn đề hoàn toàn.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Preloads keyboard so there's no lag on initial keyboard appearance.
  UITextField *lagFreeField = [[UITextField alloc] init];
  [self.window addSubview:lagFreeField];
  [lagFreeField becomeFirstResponder];
  [lagFreeField resignFirstResponder];
  [lagFreeField removeFromSuperview];
}

1
@Vadoff đẹp và đơn giản - đây là phiên bản nội tuyến của ví dụ UIResponder + KeyboardCache được đưa ra dưới đây
amergin

4
Điều này đã được HĐH xử lý ... nhưng ồ: /
chakrit

9
cảm ơn! vấn đề vẫn còn trên ios8 không may, nhưng vấn đề này vẫn giải quyết được
hitme

1
@Vadoff Solution hoạt động, nhưng có 2 điểm trừ: 1) Tôi có thêm khoảng 1 giây tải ứng dụng; 2) Nhận được cảnh báo bộ nhớ (nhưng, không phải tất cả thời gian). Tôi đã cố gắng thêm mã này vào UIViewControll trong viewDidLoad, nhưng không có tác dụng, có lẽ tôi đã làm gì đó sai? Bạn có thể chỉnh sửa câu trả lời của bạn và thêm mã cho trình điều khiển xem, nếu điều này có thể.
Dima Deplov 6/03/2015

16
Thực tế rằng đây là câu trả lời chính xác và làm việc khiến tôi khóc. Tôi đã phải tắm sau khi áp dụng hack này.
Bill Burgess

27

Vâng, tôi cũng có một vài giây chậm trễ trên iPhone 4s mới nhất. Đừng hoảng sợ. Vì một số lý do, nó chỉ xảy ra lần đầu tiên khi ứng dụng được tải từ Xcode trong Debug. Khi tôi phát hành, tôi không nhận được sự chậm trễ. Chỉ cần quên nó...


6
Đó là do mức độ tối ưu hóa : Fastest, Smallest [-Os]. Bạn có thể thay đổi nó vàoBuild Settings > Optimization Level
Carlos Ricardo

20

3
Cảm ơn, nhiều liên kết đề cập đến độ trễ là "1 giây trên điện thoại cũ", "không đáng chú ý trên 3g" và "tải ngay lập tức trên thiết bị mới" nhưng tôi gặp phải độ trễ dài hơn 3-4 giây trên iphone 4s. Tôi sẽ thử tải trước bàn phím tiếp theo, nhưng tôi lo lắng rằng một cái gì đó khác có thể là một vấn đề (có lẽ là ios5 hoặc xcode ver của tôi?).
Vadoff

Bạn đã thử cách UITextField và bàn phím hoạt động trong ứng dụng gốc chưa? Hãy chắc chắn xóa nó khỏi bộ nhớ cho phép kiểm tra này (nhấp đúp chuột vào nút home ...). Không có gì sai với đoạn mã bạn đã đăng và 3-4 giây thực sự có vẻ rất nhiều - quá nhiều. Tôi chưa bao giờ thử tải trước này nhưng có vẻ như cách giải quyết duy nhất.
Rok Jarc

Vâng, TextField cho Maps sẽ hiển thị bàn phím ngay lập tức khi được nhấp sau khi khởi chạy. Tôi xóa nó khỏi bộ nhớ và thử một vài lần, nó ngay lập tức mỗi lần. Tôi không chắc tại sao tôi lại chậm như vậy.
Vadoff

Mới làm một thử nghiệm trên một trong những ứng dụng của tôi sử dụng UITextField - độ trễ thực sự rất nhỏ. Mã bạn đã đăng có vẻ ổn vì vậy phải có một cái gì đó giữ lại chủ đề chính. Đây có thể là thời điểm tốt để khởi chạy các dụng cụ khét tiếng.
Rok Jarc

23
Được rồi, cho bất cứ ai khác dường như có vấn đề này. Tôi phát hiện ra nó chỉ xảy ra vào lần đầu tiên ứng dụng được cập nhật trên iphone từ xcode. Khi ứng dụng được tải trên iphone, bất kỳ việc sử dụng nào nữa với ứng dụng sẽ dẫn đến hành vi bình thường (tôi đã xóa chương trình khỏi bộ nhớ một vài lần / khởi động lại iphone để đảm bảo).
Vadoff

18

Bạn có thể sử dụng giải pháp của Vadoff trong Swift bằng cách thêm giải pháp này vào didFinishLaunchingWithOptions:

// Preloads keyboard so there's no lag on initial keyboard appearance.
let lagFreeField: UITextField = UITextField()
self.window?.addSubview(lagFreeField)
lagFreeField.becomeFirstResponder()
lagFreeField.resignFirstResponder()
lagFreeField.removeFromSuperview()

Nó hoạt động với tôi trong iOS 8.


5

Mã trong khối được thêm vào hàng đợi chính và chạy không đồng bộ. (không khóa chủ đề chính)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });

6
Cố gắng thêm một lời giải thích bằng văn bản mô tả lý do tại sao mã của bạn hoạt động và không chỉ đưa ra để người khác có thể học hỏi từ nó.
Sled

7
Trên thực tế, mã này chặn luồng chính, bạn đang gửi trên hàng đợi chính ...
Werner Altewischer

Bạn có biết sự khác biệt giữa Clark_async / Clark_sync không? Và bạn có nghĩ rằng [textField trở thànhFirstResponder]; là rất khó cho chủ đề chính?
Serge Petruk

@Spetruk Chuỗi gọi hàm Clark_async không bị chặn, nhưng luồng mà bạn thực sự chạy mã trên chắc chắn bị chặn. Một luồng duy nhất không thể thực hiện hai việc cùng một lúc, do đó, mã này chặn luồng chính (vì Clark_get_main_queue) nhưng không chặn luồng trong đó gọi hàm Clark_async.
Kevin

@Kevin nhưng một cái gì đó đang chặn luồng chính và kết quả là hoạt hình bàn phím không hoạt động. Tôi đồng ý với bạn, nhưng ý kiến ​​của tôi, giải pháp với textFiled trong appDelegate có mùi rất tệ.
Serge Petruk


1

Một vấn đề liên quan, trong đó trình bày UIViewControll chậm, đã được giải quyết bằng cách sử dụng phông chữ hệ thống thay vì phông chữ tùy chỉnh trên UITextField. Có lẽ sử dụng phông chữ hệ thống cũng có thể làm việc cho vấn đề này?


0

Lỗi này dường như đã được sửa trong iOS 9.2.1. Kể từ khi nâng cấp thiết bị của mình, tôi không còn bị trễ giữa việc chạm vào trường văn bản và bàn phím xuất hiện khi thiết bị của tôi được kết nối với máy tính.


1
Nó dường như được sửa trên iPhone nhưng tôi vẫn bị lag trên iPad.
Adarkas2302

0

Câu trả lời được chọn này gây ra sự cố BAD_EXC trên iOS 11 - xóa khỏi ứng dụng để khắc phục


-2

Bạn có thể thêm mã bên dưới khi chế độ xem của viewContoder đã được tải, như viewDidAppear. Không chỉ ứng dụng: didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
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.