วิธีง่ายๆในการยกเลิกคีย์บอร์ด?


376

ฉันมีตัวควบคุมค่อนข้างน้อยกระจัดกระจายไปทั่วเซลล์ของตารางในตารางของฉันและฉันสงสัยว่ามีวิธีที่ง่ายกว่าในการยกเลิกคีย์บอร์ดโดยไม่ต้องวนลูปผ่านการควบคุมทั้งหมดของฉันและลาออกทั้งหมดเป็นคำตอบแรก ฉันเดาคำถามคือ .. ฉันจะตอบกลับไปยังแป้นพิมพ์แรกได้อย่างไร


เป็นส่วนเสริมที่ดีสำหรับคำถามนี้: stackoverflow.com/questions/1490573/…
ericsoco

คำเตือนสำหรับคำตอบทั้งหมดด้านล่าง หากคุณทำสิ่งต่อไปนี้หลังจากที่คุณลาออกจาก KB แล้ว KB ของเด็กกำพร้าและไม่สามารถถูกไล่ออกได้ คุณต้องยกเลิก KB ในวิธีการ textFieldShouldReturn
gjpc

26
แป้นพิมพ์ทั่วโลกเลิกใช้วิธีที่ถูกต้อง:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Yerk

ผมว่านี้เป็นประโยชน์วิดีโอ pinkstone.co.uk/... อาจช่วยคนอื่นได้
กระตือรือร้นมาก

คำตอบ:


796

ลอง:

[self.view endEditing:YES];

1
ดูเหมือนว่าจะใช้งานได้ (ทดสอบบน ios4.1) แม้ว่ามันจะใช้ได้เฉพาะใน iOS 3.2 ขึ้นไป ฉันไม่แน่ใจว่าสิ่งนี้รับประกันได้จริงหรือไม่หรือเป็นผลข้างเคียงที่ไม่รับประกันการเรียก API ในวิธีที่ไม่ได้รับการบันทึกไว้ในการทำงาน
JosephH

3
สิ่งนี้ได้ผลอย่างสมบูรณ์แบบสำหรับฉันและแน่นอนว่าเป็นคำตอบที่ดีกว่าสำหรับคำถามนี้ เอกสารกล่าวว่ามีให้ใน iOS 2.0 และใหม่กว่า
antsyawn

8
ตามที่เอกสารระบุว่า: "วิธีนี้ดูที่มุมมองปัจจุบันและลำดับชั้นย่อยของมุมมองสำหรับฟิลด์ข้อความที่ตอบกลับเป็นครั้งแรกในปัจจุบันหากพบวิธีหนึ่งจะถามว่าช่องข้อความนั้นจะลาออกเป็นการตอบกลับครั้งแรกหากตั้งค่าพารามิเตอร์บังคับ ถึงใช่ช่องข้อความไม่เคยถูกถามเลยมันถูกบังคับให้ลาออก " - ดังนั้นนี่คือ IMO คำตอบที่ถูกต้องสำหรับคำถามดั้งเดิม (กรณีใช้งาน: ฉันมีแบบฟอร์มที่มีเขตข้อมูลนับล้านฟิลด์มีสิบ ... หรือมากกว่านั้นและฉันจำเป็นต้องยกเลิกแป้นพิมพ์)
joshis

14
คำตอบไม่ผิด แต่ผิดเล็กน้อยจริง ๆ ควรเป็น: [self.view endEditing:YES];เนื่องจากค่าบูลคือ YES / NO ใน Objective-C
chrisben

24
chrisben: คุณสามารถใช้ YES / NO, TRUE / FALSE, 0/1
Michael Superczynski

126

คุณสามารถบังคับให้มุมมองการแก้ไขปัจจุบันลาออกสถานะการตอบกลับแรกด้วย [view endEditing:YES]คุณสามารถบังคับมุมมองการแก้ไขในขณะนี้ที่จะลาออกสถานะครั้งแรกตอบกลับด้วยนี่จะซ่อนแป้นพิมพ์

ซึ่งแตกต่างจาก-[UIResponder resignFirstResponder], -[UIView endEditing:]จะค้นหาผ่าน subviews เพื่อหาสิ่งที่ตอบกลับแรกปัจจุบัน ดังนั้นคุณสามารถส่งมันไปยังมุมมองระดับบนสุดของคุณ (เช่นself.viewในUIViewController ) และมันจะทำสิ่งที่ถูกต้อง

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


แต่นั่นจะบล็อกองค์ประกอบจากการเป็นครั้งแรกที่ตอบสนองไม่ลบสถานะการตอบกลับแรกในปัจจุบันจากองค์ประกอบ
Kendall Helmstetter Gelner

สิ่งที่ฉันหมายถึงในการเอาชนะการตอบกลับแรกเพื่อเก็บการตอบกลับแรกไว้ที่ใดที่หนึ่งเพื่อให้สามารถเข้าถึงได้ (ในกรณีนี้ลาออก) ในภายหลัง ปัญหาพื้นฐานคือ Cocoa Touch ไม่ได้มีวิธีในการถามหน้าต่างหรือดูสิ่งที่ตอบกลับเป็นครั้งแรก
นิโคลัสไรลีย์

+1 การเพิ่มการตอบสนองกลายเป็นFirstResponderแก้ไขปัญหาที่ฉันมีกับก๊อกใน UITextFields อื่น ๆ
Jason George

3
สิ่งนี้ล้าสมัยแล้ว [self.view endEditing:YES];คำตอบจะดีกว่า
ftvs

1
คำตอบนี้อธิบายได้อย่างชัดเจนว่า[UIView endediting:]ทำงานอย่างไร ในหนึ่งในแอพที่ฉันพัฒนาขึ้นช่องค้นหาถูกเพิ่มใน UINavigationViewController ถ้าคุณเพิ่งเรียก[self.view endEditing:YES]เป็นselfตัวควบคุมมุมมองของคุณสิ่งนี้จะไม่ทำงานแทนฉันเรียกวิธีนี้โดยตรงในขอบเขตการดูที่เพิ่มช่องค้นหาตัวอย่าง: [self.mySearchBoxView endEditing:YES].
Jan Cássio

92

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

Objective-C:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

สวิฟท์ 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

การกระทำที่ไม่มีเป้าหมายเป็นเรื่องปกติใน Mac OS X สำหรับคำสั่งเมนูและนี่คือการใช้งานสำหรับพวกเขาบน iOS


14
ทางออกที่ดีที่สุดของหน้าทั้งหมด
Leo Natan

วิธีที่ดีที่สุดในการกำจัดคีย์บอร์ดจากทุกที่ในแอพ iOS
Ben Sinclair

ยังใช้งานได้สำหรับฉันใน iOS8 ในแอปพลิเคชันของฉันฉันมีเมนูแถบด้านข้างและมีบางครั้งที่ตัวควบคุมมุมมอง "กึ่งกลาง" แสดงแป้นพิมพ์ และฉันต้องการยกเลิกแป้นพิมพ์หากเมนูแถบด้านข้างจะปรากฏขึ้น ดังนั้นฉันจึงเพิ่มรหัสนี้ในเมนูแถบด้านข้างของชั้นวิธี 'viewWillAppear
Jenn Eve

1
ยังคงใช้งานได้ใน iOS 9 วิธีที่ยอดเยี่ยมในการลาออกจากการโฟกัสไปยังฟิลด์ข้อความและยกเลิกคีย์บอร์ด
bmjohns

และเพื่อดำเนินการต่อความคิดเห็นที่เฉพาะเจาะจงนี้ .... ยังคงใช้งานได้ใน iOS 10 :-)
Traveller Man

56

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

  1. ใน viewDidLoad ให้ลงทะเบียนเพื่อรับการแจ้งเตือนคีย์บอร์ดและสร้าง UITapGestureRecognizer:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
  2. เพิ่มการตอบกลับการแสดง / ซ่อนแป้นพิมพ์ ที่นั่นคุณเพิ่มและลบ TapGestureRecognizer ไปยัง UIView ที่ควรปิดคีย์บอร์ดเมื่อแตะ หมายเหตุ: คุณไม่จำเป็นต้องเพิ่มลงในมุมมองย่อยหรือตัวควบคุมทั้งหมด

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
  3. TapGestureRecognizer จะเรียกใช้ฟังก์ชั่นของคุณเมื่อได้รับการแตะและคุณสามารถยกเลิกคีย์บอร์ดดังนี้:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }

สิ่งที่ดีเกี่ยวกับการแก้ปัญหานี้คือมันเพียงกรอง Taps ไม่ใช่ swipes ดังนั้นหากคุณมีเนื้อหาการเลื่อนอยู่เหนือแป้นพิมพ์ swipes จะยังคงเลื่อนและปล่อยให้แป้นพิมพ์ปรากฏ ด้วยการลบตัวรู้จำท่าทางหลังจากแป้นพิมพ์หายไปก๊อกน้ำในอนาคตของคุณจะได้รับการจัดการตามปกติ


ใน @implementation ของฉันฉันได้เพิ่ม @property (มอบหมาย) UITapGestureRecognizer * tapRecognizer; และแก้ไข self.tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: การกระทำด้วยตนเอง: @selector (didTapAnywhere :)];
ศาสตราจารย์ทอดด์

ฉันพยายามทำสิ่งที่คล้ายกันและฉันไม่ได้รับการติดต่อกลับเมื่อแตะ อยากรู้อยากเห็น: ทำไมคุณสมบัติของคุณ 'กำหนด'?
TahoeWolverine

บวกหนึ่งและนอกจากนี้ควรเป็นพฤติกรรมเริ่มต้นของ iOS หรืออย่างน้อยก็เพิ่มวิธีง่ายๆในการสลับปุ่มเลิกใช้
Shaunti Fondrisi

24

นี่เป็นวิธีแก้ปัญหาที่ทำให้แป้นพิมพ์หายไปเมื่อกดreturnในฟิลด์ข้อความใด ๆโดยเพิ่มรหัสในที่เดียว (ดังนั้นไม่ต้องเพิ่มตัวจัดการสำหรับแต่ละฟิลด์ข้อความ):


พิจารณาสถานการณ์นี้:

ฉันมีviewcontrollerสองฟิลด์ข้อความ (ชื่อผู้ใช้และรหัสผ่าน) และการviewcontrollerปฏิบัติUITextFieldDelegateโปรโตคอลที่

ฉันทำสิ่งนี้ใน viewDidLoad

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

และ viewcontroller ใช้เมธอดเผื่อเลือกเป็น

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

และไม่ว่าคุณจะอยู่ใน textfield ทันทีที่ฉันไปถึง returnแป้นคีย์บอร์ดมันก็จะถูกไล่ออก!

ในกรณีของคุณสิ่งเดียวกันจะทำงานได้ตราบใดที่คุณตั้งค่าผู้รับมอบสิทธิ์ของ textfield ให้เป็นของตนเองและนำไปใช้ textFieldShouldReturn


ฉันได้แก้ไขปัญหาเรียบร้อยแล้ว แต่ในกรณีของฉันฉันต้องการยกเลิกแป้นพิมพ์ด้วยตัวเอง (เป็นรหัส) และฉันไม่ทราบว่าฟิลด์ข้อความใดที่มีสถานะการตอบกลับเป็นครั้งแรก
Seventoes

1
มีหลายกรณีที่คุณอาจต้องการยกเลิกคีย์บอร์ดโดยไม่ต้องกดปุ่ม "ย้อนกลับ" ตัวอย่างเช่นเมื่อเมนูด้านข้างกำลังจะปรากฏขึ้น
Peter Johnson

แก้ไขเพื่อชี้แจงว่าคำตอบนี้เกี่ยวข้องเฉพาะในสถานการณ์ที่การกดปุ่ม "ส่งคืน" เป็นวิธีแก้ปัญหาที่ยอมรับได้ [ในกรณีของฉันฉันต้องการยกเลิกคีย์บอร์ดเมื่อผู้ใช้แตะนอกเขตที่กำลังแก้ไข คำตอบนี้ไม่ช่วยด้วย]]
ToolmakerSteve

14

วิธีที่ดีกว่าคือการมีสถานะ "การตอบกลับ" เป็นครั้งแรก

เนื่องจาก UIApplication เป็น subclass ของ UIResponder คุณสามารถลอง:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

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


1
เคล็ดลับ UIApplication ไม่ทำงาน (มันล้มเหลวอย่างน้อยก็ในเครื่องจำลอง) แต่คุณไม่จำเป็นต้องใช้ UITextField ขนาดศูนย์ - เพียงแค่เลือกฟิลด์สุ่มและทำสิ่งนี้ การตอบสนองของ NSResponderFirstResponder เป็นวิธีการแจ้งเตือนเท่านั้น แต่ UIResponder นั้นไม่ใช่ (การออกแบบแย่ลงจริง)
นิโคลัสไรลีย์

1
อ้าขอบคุณ! มันขัดข้องที่เรียกมันว่า UIApplication แต่ UITextField ขนาดศูนย์นั้นใช้งานได้ดีมากและฉันไม่จำเป็นต้องเรียกข้อมูลใด ๆ ของฟิลด์ก่อนหน้านี้
Seventoes

ทำไมทุกคนจะทำเช่นนี้หากมีวิธีการที่เป็นทางการดีและสมบูรณ์แบบสำหรับเอกสารนี้
Maciej Swic

2
พวกเขาจะไม่เห็นคำตอบที่ upvoted ที่สุดสำหรับวิธีแก้ปัญหาที่ดีกว่า มันไม่เป็นที่รู้จักกันดีในเวลานั้น (คำตอบของฉันคือจากปี 2009 คำตอบอื่นมามากกว่าหนึ่งปีต่อมาในปี 2010) แต่ฉันทิ้งไว้เพื่อลูกหลาน
Kendall Helmstetter Gelner

8

เก็บสิ่งนี้ไว้ในยูทิลิตี้บางคลาส

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}

1
นี่คือสิ่งที่ฉันกำลังมองหา!
aslisabanci

สมบูรณ์แบบยกเว้นคุณไม่ต้องการใช้วิธี globalResignFirstResponderRec เลยเพียงแค่เรียก [ดู endEditing: YES] แทน มันทำสิ่งเดียวกัน
n13

ใช่ ทางออกสุดท้าย! ฉันลองหลายวิธีมีเพียงอันเดียวที่เหมาะกับฉัน! ขอบคุณมาก!
douyw

6

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

ยอดเยี่ยมอย่างแน่นอน!

ขอบคุณ.

พิจารณาคำแนะนำของคุณและคำแนะนำของผู้อื่นในหัวข้อนี้นี่คือสิ่งที่ฉันได้ทำ:

ดูเหมือนว่าเมื่อใช้:

[[self appDelegate] dismissKeyboard]; (หมายเหตุ: ฉันเพิ่ม appDelegate เป็นส่วนเสริมของ NSObject เพื่อให้ฉันสามารถใช้ที่ใดก็ได้ในทุกสิ่ง)

สิ่งที่ดูเหมือนอยู่ใต้ฝากระโปรง:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

แก้ไข

tempTextField.enabled = NO;การแก้ไขคำตอบของฉันรวม การปิดใช้งานฟิลด์ข้อความจะป้องกันUIKeyboardWillShowNotificationและการUIKeyboardWillHideNotificationแจ้งเตือนทางคีย์บอร์ดไม่ให้ส่งหากคุณใช้การแจ้งเตือนเหล่านี้ตลอดทั้งแอพของคุณ


ฉันไม่รู้ว่ามันใช้งานได้หรือเปล่า แต่ดูเหมือนว่าจะเป็นวิธีที่ฉลาดและง่าย
อสูร

5

เคล็ดลับอย่างรวดเร็วเกี่ยวกับวิธียกเลิกคีย์บอร์ดใน iOS เมื่อผู้ใช้สัมผัสที่ใดก็ได้บนหน้าจอด้านนอกของ UITextField หรือคีย์บอร์ด เมื่อพิจารณาจากปริมาณการใช้แป้นพิมพ์ iOS จริง ๆ แล้วมันสมเหตุสมผลที่จะมีวิธีที่ง่ายและใช้งานง่ายสำหรับผู้ใช้ของคุณในการยกเลิกคีย์บอร์ด

นี่คือลิงค์


ที่ดี! การเพิ่มใน AppDelegate ทำให้ใช้ได้กับทุกมุมมองที่เกี่ยวข้อง
Jiulong Zhao

5

คำตอบที่ซับซ้อนมากเกินไปอาจเป็นเพราะนี่ไม่ใช่สิ่งที่หาได้ยากในเอกสารประกอบ iOS โจเซฟมีสิทธิเหนือ:

[[view window] endEditing:YES];

4

เรียบง่ายกว่าคำตอบของ Meagar

เขียนทับ touchesBegan:withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}

นี้จะเมื่อคุณสัมผัสที่ใดก็ได้ในdismiss the keyboardbackground


3

นี่คือสิ่งที่ฉันใช้ในรหัสของฉัน มันใช้งานได้เหมือนมีเสน่ห์!

ใน yourviewcontroller.h เพิ่ม:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

ตอนนี้ในไฟล์. m เพิ่มสิ่งนี้ในฟังก์ชั่น ViewDidLoad ของคุณ:

- (void)viewDidLoad {
    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

รวมทั้งเพิ่มฟังก์ชั่นนี้ในไฟล์. m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

ขอบคุณ! แต่คุณควรเปลี่ยนชื่อฟังก์ชั่นเป็น 'didTapAnywhere' หรือตัวจดจำท่าทางเป็น 'handleSingleTap' ;-)
Matthijs

2

ในไฟล์ส่วนหัวของตัวควบคุมมุมมองของคุณเพิ่ม<UITextFieldDelegate>คำจำกัดความของอินเทอร์เฟซของตัวควบคุมของคุณเพื่อให้เป็นไปตามโปรโตคอลผู้รับมอบสิทธิ์ UITextField ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... ในไฟล์การนำไปใช้งานของคอนโทรลเลอร์ (.m) เพิ่มวิธีการต่อไปนี้หรือรหัสข้างในหากคุณมีวิธีการ viewDidLoad ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... จากนั้นเชื่อมโยงกล่องข้อความของคุณกับฟิลด์ข้อความจริง

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}

2

คุณควรส่งendEditing:ไปที่หน้าต่างการทำงานเป็นคลาสย่อยของUIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];

ฉันพนันว่าคุณหมายถึงใช่แทน)
Matrosov Alexander

2

วิธีที่ดีที่สุดในการยกเลิกคีย์บอร์ดจาก UITableView และ UIScrollView คือ:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

2

ใน swift 3 คุณสามารถทำสิ่งต่อไปนี้

UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)

1

คำตอบของ Jeremy ไม่ได้ผลสำหรับฉันฉันคิดว่าเพราะฉันมีการนำทางกองซ้อนในมุมมองแท็บที่มีกล่องโต้ตอบโมดัลอยู่ด้านบน ฉันกำลังใช้สิ่งต่อไปนี้ในขณะนี้และมันก็ใช้ได้กับฉันแล้ว

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}

อืม - ทำไมลงคะแนนเสียง? ฉันพูดถึงข้อบกพร่องในโลกแห่งความจริงที่เฉพาะเจาะจงในอีกคำตอบด้วยรหัสทดสอบ ฉันสามารถเข้าใจการขาดการลงคะแนน แต่การลงคะแนนให้ฉันในเชิงลบคือความท้อแท้จริง ฉันยังหวังว่าคำตอบข้างต้นจะช่วยคนอื่น
JJ Rohrer

1

คุณอาจต้องแทนที่ UIViewController ปิดการใช้งานอัตโนมัติKeyboardDismissalเพื่อให้สิ่งนี้สามารถใช้งานได้ในบางกรณี สิ่งนี้อาจต้องทำบน UINavigationController หากคุณมี


1

คลาสย่อย textfields ของคุณ ... และ textviews

ในคลาสย่อยให้ใส่รหัสนี้ ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

ในผู้แทนฟิลด์ข้อความ (ในทำนองเดียวกันสำหรับผู้แทนข้อความ)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

ทุกชุด .. เพียงแค่โพสต์การแจ้งเตือนจากที่ใดก็ได้ในรหัสของคุณ มันจะลาออกจากแป้นพิมพ์ใด ๆ


1

และอย่างรวดเร็วเราทำได้

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)

ฉันไม่เข้าใจวิธีการตอบกลับแรกทำงาน .. ฉันจะใส่ที่ไหน ในตัวควบคุมมุมมองหรือตัวแทนของฉัน
Shayan C

ไม่เป็นไร คุณสามารถวางไว้ในตำแหน่งที่คุณต้องการ การกระทำของปุ่ม ie
Eike

1

ที่จะยกเลิกแป้นพิมพ์แป้นพิมพ์หลังจากที่ได้โผล่ขึ้นมามี2 ราย ,

  1. เมื่อ UITextField อยู่ใน UIScrollView

  2. เมื่อ UITextField อยู่นอก UIScrollView

2. เมื่อ UITextField อยู่นอก UIScrollView จะแทนที่เมธอดในคลาสย่อย UIViewController ของคุณ

คุณต้องเพิ่มผู้รับมอบสิทธิ์สำหรับ UITextView ทั้งหมด

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. ในมุมมองเลื่อนการแตะนอกจะไม่เริ่มเหตุการณ์ใด ๆดังนั้นในกรณีที่ใช้แตะท่าทางลายมือลากและวางUITapGestureสำหรับมุมมองเลื่อนและสร้าง IBAction สำหรับมัน

ในการสร้าง IBAction ให้กด ctrl + คลิกที่ UITapGesture แล้วลากไปยังไฟล์. h ของ viewcontroller

ที่นี่ฉันได้ตั้งชื่อ tappedEvent เป็นชื่อการกระทำของฉัน

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

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

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


0

ฉันเกลียดที่ไม่มีวิธี "ทั่วโลก" ในการยกเลิกคีย์บอร์ดโดยทางโปรแกรมโดยไม่ต้องใช้การเรียก API ส่วนตัว บ่อยครั้งที่ฉันจำเป็นต้องยกเลิกแป้นพิมพ์โดยทางโปรแกรมโดยไม่ทราบว่าวัตถุใดเป็นคำตอบแรก ฉันใช้วิธีการตรวจสอบการselfใช้ Objective-C runtime API เพื่อแจกแจงคุณสมบัติทั้งหมดดึงประเภทที่เป็นประเภทออกมาUITextFieldแล้วส่งresignFirstResponderข้อความ

ไม่ควรที่จะทำเช่นนี้ ...


0

มันไม่สวย แต่วิธีที่ฉันลาออกการตอบกลับครั้งแรกเมื่อฉันไม่รู้ว่าการตอบกลับคืออะไร:

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

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

0

คุณสามารถวนซ้ำซ้ำ ๆ ผ่านการดูย่อยจัดเก็บอาร์เรย์ของ UITextFields ทั้งหมดแล้ววนซ้ำมันและลาออกทั้งหมด

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

ฉันแก้ไขมันด้วยวิธีที่ซับซ้อนมากขึ้น แต่ใช้วิธีการได้มากกว่า แต่ใช้ singleton / manager สำหรับแอนิเมชั่นของแอพของฉันและทุกครั้งที่ฟิลด์ข้อความกลายเป็นคำตอบ กวาด (ลาออก) จากเหตุการณ์อื่น ๆ ... เป็นไปไม่ได้ที่ฉันจะอธิบายในย่อหน้า

มีความคิดสร้างสรรค์ใช้เวลาเพียง 10 นาทีในการคิดสิ่งนี้สำหรับแอพของฉันหลังจากที่ฉันพบคำถามนี้


แก้ไขเมื่อหลายเดือนที่ผ่านมา;) ฉันเพิ่งจะบันทึกฟิลด์แอคทีฟที่โฟกัสและใช้สิ่งนั้น
Seventoes

0

วิธีที่แข็งแกร่งกว่าเล็กน้อยที่ฉันต้องการใช้เมื่อเร็ว ๆ นี้:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

ฉันพบวิธีการ "ทั่วโลก" อื่น ๆ บางอย่างไม่ทำงาน (ตัวอย่างเช่นUIWebView& WKWebViewปฏิเสธที่จะลาออก)


0

เพิ่ม A Tap Gesture Recognizer ให้กับมุมมองของคุณและกำหนด ibaction

ไฟล์. m ของคุณจะเป็นเช่นนั้น

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

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


0

ใช่ endEditing เป็นตัวเลือกที่ดีที่สุด และจาก iOW 7.0 UIScrollViewมีคุณสมบัติเจ๋ง ๆ ในการยกเลิกคีย์บอร์ดในการโต้ตอบกับมุมมองเลื่อน เพื่อให้บรรลุนี้คุณสามารถตั้งค่าคุณสมบัติของkeyboardDismissModeUIScrollView

ตั้งค่าโหมดยกเลิกคีย์บอร์ดเป็น:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

มันมีประเภทอื่นไม่กี่ ดูเอกสารแอปเปิ้ลนี้



0

วิธีที่ง่ายที่สุดคือการเรียกใช้เมธอด

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}

คุณไม่ต้องการ 'ถ้า' ที่นั่นลาออกการตอบกลับแรกจะทำทุกอย่าง บางทีคุณอาจหมายถึง - (BOOL) canResignFirstResponder?
Seventoes

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.