การหน่วงเวลา / การหน่วงช้าสุดสำหรับการเคลื่อนไหวของแป้นพิมพ์เริ่มต้นของ UITextField


169

เอาล่ะปัญหานี้ทำให้ฉันบ้า

มันต้องใช้เวลาประมาณ 3-4 UITextFieldวินาทีเพื่อให้แป้นพิมพ์จะปรากฏขึ้นหลังจากที่ผมสัมผัสของฉัน สิ่งนี้จะเกิดขึ้นในครั้งแรกที่แป้นพิมพ์โผล่ขึ้นมาตั้งแต่เปิดตัวแอปหลังจากนั้นภาพเคลื่อนไหวจะเริ่มขึ้นทันที

ตอนแรกฉันคิดว่ามันเป็นปัญหาในการโหลดภาพมากเกินไปหรือของฉันUITableViewแต่ฉันเพิ่งสร้างโปรเจ็กต์ใหม่ที่มีเพียงแค่ a UITextFieldและฉันยังคงประสบปัญหานี้อยู่ ฉันใช้ iOS 5, Xcode ver 4.2 และใช้งานบน iPhone 4S

นี่คือรหัสของฉัน:

#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

นี่เป็นปัญหาที่พบบ่อยสำหรับแอปทั้งหมดหรือไม่

ตอนนี้วิธีเดียวที่ฉันจะทำให้ดีขึ้นก็คือการtextFieldเป็น / ลาออกก่อนตอบกลับviewDidAppearมา แต่ก็ไม่ได้แก้ปัญหาทั้งหมด - มันเพียงแค่โหลดล่าช้าไปเมื่อดูโหลดแทน ถ้าฉันคลิกtextFieldทันทีเมื่อมุมมองโหลดฉันยังคงได้รับปัญหา หากฉันรอประมาณ 3-4 วินาทีหลังจากที่โหลดมุมมองก่อนที่จะแตะฟิลด์ข้อความฉันจะไม่ล่าช้า

คำตอบ:


291

ก่อนที่คุณจะใช้การแฮ็กแปลกใหม่เพื่อแก้ไขปัญหานี้ให้ลองสิ่งนี้: หยุดเซสชันการดีบักปิดแอปจากมัลติทาสก์ถอดปลั๊กอุปกรณ์ของคุณออกจากคอมพิวเตอร์และเรียกใช้แอปตามปกติโดยแตะที่ไอคอน ฉันได้เห็นอย่างน้อยสองกรณีที่ความล่าช้าเกิดขึ้นเพียงในขณะที่เสียบอุปกรณ์


2
นี่เป็นคำตอบที่ถูกต้องในกรณีของฉันใน iPhone 5 ที่ใช้ iOS 8.1 - ฉันกำลังประสบกับความล่าช้าประมาณ 1 วินาทีสำหรับแป้นพิมพ์แรก
bejonbee

7
ใช่ lagg เกิดขึ้นเฉพาะเมื่อทำการดีบั๊ก แปลก.
Pauls

16
ขอบคุณ. ปัญหานี้ยังคงมีอยู่ใน iOS 9.1 / Xcode 7.1, Swift 2.1
Yaroslav

4
FYVM Apple, FYVM เวลา 90 นาทีตามกำหนดเวลาฉันไม่สามารถจ่ายได้ โหวต 20 ถ้าฉันทำได้ ยังคงอยู่ใน iOS9.2 / Xcode 7.2
BaseZen

1
นี่คือสิ่งที่ปัญหาของฉันก็เช่นกัน หลังจากที่ฉันถอดปลั๊กจากแม็คของฉันไม่มีความล่าช้า (ios9) xcode 7.2
เลิกใช้แล้ว Darren

148

ดังนั้นปัญหาไม่ได้ จำกัด เพียงแค่การติดตั้งครั้งแรกอย่างที่ฉันเคยคิด แต่เกิดขึ้นทุกครั้งที่เปิดตัวแอป นี่คือทางออกของฉันที่แก้ปัญหาได้อย่างสมบูรณ์

- (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
Nice and simple @Vadoff - นี่เป็นเวอร์ชั่นอินไลน์ของตัวอย่าง UIResponder + KeyboardCache ที่ระบุด้านล่าง
amergin

4
สิ่งนี้ควรได้รับการจัดการโดยระบบปฏิบัติการ ... แต่ก็ดี: /
chakrit

9
ขอบคุณ! ปัญหายังคงอยู่ใน ios8 น่าเสียดาย แต่วิธีแก้ปัญหานี้ยังแก้ไขได้
hitme

1
@Vadoff Solution ทำงานได้ แต่มี 2 minuses: 1) ฉันมีเวลาโหลดแอปเพิ่มประมาณ 1 วินาที; 2) คำเตือนหน่วยความจำที่ได้รับ (แต่ไม่ใช่ตลอดเวลา) ฉันพยายามเพิ่มรหัสนี้ให้กับ UIViewController ใน viewDidLoad แต่ไม่มีผลฉันอาจทำอะไรผิดหรือเปล่า? คุณสามารถแก้ไขคำตอบและเพิ่มรหัสสำหรับตัวควบคุมมุมมองได้หรือไม่ถ้าเป็นไปได้
Dima Deplov

16
ความจริงที่ว่านี่คือคำตอบที่ถูกต้องและผลงานทำให้ฉันร้องไห้ ฉันต้องอาบน้ำหลังจากสมัครแฮ็คนี้
Bill Burgess

27

ใช่ฉันยังมีความล่าช้าไม่กี่วินาทีใน iPhone 4s ล่าสุด อย่าตกใจ ด้วยเหตุผลบางอย่างมันจะเกิดขึ้นเฉพาะในครั้งแรกที่โหลดแอปจาก Xcode ใน Debug เมื่อฉันปล่อยฉันจะไม่ล่าช้า แค่ลืมมัน ...


6
Fastest, Smallest [-Os]มันเกิดจากการเพิ่มประสิทธิภาพระดับ: คุณสามารถเปลี่ยนมันได้Build Settings > Optimization Level
Carlos Ricardo

20

นี่เป็นปัญหาที่ทราบกันดี

แป้นพิมพ์ที่โหลดล่วงหน้าดูเหมือนว่าจะมีแนวโน้ม ตรวจสอบการโหลดล่วงหน้า UIKeyboard

วัสดุการอ่านเพิ่มเติมบางส่วน:

แป้นพิมพ์เสมือนจริงของ iPhone เริ่มต้นช้าสำหรับ UITextField ต้องการแฮ็คนี้หรือไม่

แป้นพิมพ์ UITextField บล็อก Runloop ขณะที่โหลดหรือไม่

http://www.iphonedevsdk.com/forum/iphone-sdk-development/12114-uitextfield-loooong-delay-when-first-tapped.html


3
ขอบคุณลิงก์จำนวนมากกล่าวถึงความล่าช้าเป็น "1 วินาทีบน iphones รุ่นเก่า", "ไม่ใช่สิ่งที่เห็นได้ชัดใน 3g" และ "โหลดบนอุปกรณ์ใหม่ทันที" แต่ฉันประสบกับความล่าช้าอีก 3-4 วินาทีใน iphone 4s ฉันจะลองโหลดแป้นพิมพ์ต่อไป แต่ฉันกังวลว่าอาจมีปัญหาอย่างอื่น (อาจเป็น ios5 หรือ xcode ver ของฉัน)
Vadoff

คุณลองใช้วิธีทำงานของ UITextField & keyboard ในแอปเนทีฟหรือไม่ อย่าลืมลบมันออกจากหน่วยความจำก่อนการทดสอบนี้ (ดับเบิลคลิกที่ปุ่มโฮม ... ) ไม่มีอะไรผิดปกติกับชิ้นส่วนของรหัสที่คุณโพสต์และ 3-4 วินาทีดูเหมือนจะมาก - มากเกินไป ฉันไม่เคยลองใช้การโหลดล่วงหน้า แต่ดูเหมือนว่าวิธีแก้ปัญหาเท่านั้น
Rok Jarc

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

เพิ่งทดสอบกับหนึ่งในแอพของฉันที่ใช้ UITextField - ความล่าช้าควรน้อยที่สุด รหัสที่คุณโพสต์ดูเหมือนจะดีดังนั้นจึงต้องมีสิ่งอื่นในการระงับเธรดหลัก นี่อาจเป็นเวลาที่ดีในการเปิดตัวเครื่องมือที่น่าอับอาย
Rok Jarc

23
โอเคสำหรับคนอื่นที่ดูเหมือนจะมีปัญหานี้ ฉันค้นพบว่ามันเกิดขึ้นเฉพาะในครั้งแรกที่แอพได้รับการอัพเดทบน iphone จาก xcode เมื่อโหลดแอพพลิเคชั่นบนไอโฟนแล้วการใช้งานแอพต่อไปนี้จะส่งผลให้เกิดพฤติกรรมปกติ (ฉันลบโปรแกรมออกจากหน่วยความจำสองสามครั้ง / รีสตาร์ท iphone เพื่อให้แน่ใจ)
Vadoff

18

คุณสามารถใช้โซลูชันของ Vadoff ใน Swift ได้โดยเพิ่มสิ่งนี้ลงใน 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()

มันใช้งานได้สำหรับฉันใน iOS 8


5

เพิ่มรหัสในบล็อกในคิวหลักและเรียกใช้แบบอะซิงโครนัส (อย่าล็อคเธรดหลัก)

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

6
ลองเพิ่มคำอธิบายที่เป็นข้อความซึ่งอธิบายว่าทำไมโค้ดของคุณถึงทำงานได้และไม่เพียงแค่ให้มันเพื่อให้คนอื่นสามารถเรียนรู้ได้
เลื่อน

7
ในความเป็นจริงรหัสนี้จะปิดกั้นเธรดหลักคุณกำลังส่งคิวหลัก ...
Werner Altewischer

คุณรู้จักความแตกต่างระหว่าง dispatch_async / dispatch_sync หรือไม่ และคุณคิดว่า [textField กลายเป็น FirstResponder]; เป็นเรื่องยากมากสำหรับเธรดหลัก?
Sergey Petruk

@Spetruk เธรดการเรียก dispatch_async ไม่ได้ถูกบล็อก แต่เธรดที่คุณเรียกใช้รหัสบนจริง ๆ ถูกบล็อกแน่นอน เธรดเดี่ยวไม่สามารถทำสองสิ่งพร้อมกันได้ดังนั้นรหัสนี้จะบล็อกเธรดหลัก (เนื่องจาก dispatch_get_main_queue) แต่ไม่ได้บล็อกเธรดที่มีชื่อว่า dispatch_async
Kevin

@Kevin แต่มีบางอย่างกำลังบล็อกเธรดหลักและเนื่องจากภาพเคลื่อนไหวของแป้นพิมพ์ผลลัพธ์ไม่ทำงาน ฉันเห็นด้วยกับคุณ แต่ความเห็นของฉันการแก้ปัญหาด้วย textFiled ในแอพผู้แทนมีกลิ่นไม่ดี
Sergey Petruk


1

ปัญหาที่เกี่ยวข้องซึ่ง UIViewController จะช้าในการนำเสนอได้รับการแก้ไขโดยใช้แบบอักษรของระบบแทนแบบอักษรที่กำหนดเองบน UITextField บางทีการใช้แบบอักษรของระบบอาจใช้กับปัญหานี้ได้หรือไม่


0

ข้อผิดพลาดนี้ดูเหมือนว่าจะได้รับการแก้ไขใน iOS 9.2.1 ตั้งแต่การอัพเกรดอุปกรณ์ของฉันฉันไม่มีความล่าช้าระหว่างการแตะฟิลด์ข้อความและแป้นพิมพ์ปรากฏขึ้นเมื่ออุปกรณ์ของฉันเชื่อมต่อกับคอมพิวเตอร์


1
ดูเหมือนว่าจะได้รับการแก้ไขใน iPhone แต่ฉันยังคงมีความล่าช้าใน iPad
Adarkas2302

0

คำตอบที่เลือกนี้ทำให้ BAD_EXC หยุดทำงานบน iOS 11 - นำออกจากแอปเพื่อแก้ไข


-2

คุณสามารถเพิ่มโค้ดด้านล่างเมื่อมุมมองของ viewController ถูกโหลดเช่น viewDidAppear.Not แอปพลิเคชันไม่เพียง: didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.