2010-02-17 21 views
14

Tôi có gui dựa trên khung nhìn có chứa trường văn bản cho mỗi mục gui. Khi tôi chọn một mục menu khác, tôi muốn các trường văn bản của tôi thoát khỏi chế độ chỉnh sửa. Tôi không thể tìm thấy anyway để làm điều này trong tài liệu nsTextField. Bất kỳ ý tưởng?Bắt buộc trường văn bản Ca cao để kết thúc chỉnh sửa

Trả lời

39

Bạn cần phải cho các cửa sổ để loại bỏ tình trạng trả lời đầu tiên từ sự kiểm soát:

[[textField window] makeFirstResponder:nil]; 

này sẽ kết thúc chỉnh sửa và loại bỏ tập trung từ trường văn bản.

+0

này phải là một câu hỏi thường gặp – uchuugaka

+2

Không làm việc (ít nhất là trong Yosemite). –

+1

Hoạt động tốt ở Yosemite tại đây. Bạn đang gọi từ chủ đề chính? \t 'dispatch_async (dispatch_get_main_queue(),^{[textField.window makeFirstResponder: nil];});' –

11

Giải pháp sau đây từ cocoabuilder.com - Stop edit session with a NSTextField hoạt động đối với tôi cả trên OS X 10.9 và OS X 10.10 cho Mục tiêu-C và trên 10.10 cho Swift.

Đây là Objective-C phiên bản:

@implementation CustomTextField 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 

    self.target = self; 
    self.action = @selector(action:); 

    return self; 
} 

- (void)action:(NSTextField *)textField { 
    // Make something else first responder, something neutral 
    // (or can be a fake invisible element) 
    [self.window makeFirstResponder:self.window.contentView]; 

    // Other code 
} 

@end 

Bối cảnh: chấp nhận giải pháp trong chủ đề này không bao giờ làm việc cho tôi trên OS X 10.9 và 10.10 nên thay vì gọi [[textField window] makeFirstResponder:nil]; vì nó gợi ý - tôi cần phải gọi makeFirstResponder với một số lớp con NSResponder không phải nil (đây có thể là chế độ xem nội dung của NSWindow hoặc chế độ xem của NSViewController mà cả hai đều hoạt động trong trường hợp của tôi hoặc một số chế độ xem NSTextField giả không hiển thị cho người dùng đối với các trường hợp phức tạp hơn).

Chi tiết quan trọng: -[NSWindow makeFirstResponder] phải được gọi chính xác trong bộ chọn hành động của NSTextField như ví dụ của tôi minh họa. Không có nơi nào khác trong đường dẫn phương pháp NSTextField đã làm việc cho tôi (textDidEndEditing :, textShouldEndEditing: hoặc control: textShouldEndEditing :)

+1

mặc dù lạ, đây cũng là giải pháp duy nhất làm việc cho tôi. – Christian

+1

thực sự hoạt động trong khi câu trả lời được chấp nhận không, trong Yosemite –

+0

Nếu bạn đã gọi phương thức từ câu trả lời ở trên trong viewWillLayout, bạn sẽ làm mọi thứ trong một hàng mà không tạo bất kỳ lớp con nào. – iSavaDevRU

4

tôi biết đây là một câu hỏi cũ, nhưng trong trường hợp bất cứ ai thắc mắc về nhanh 3, nó chỉ làm việc cho tôi với
DispatchQueue.main.async{ self.window?.makeFirstResponder() }

+1

wow! bạn đã cứu cuộc đời tôi! – Vincenso

+0

Tôi không biết tiết kiệm cuộc sống của mình nhưng điều này thực sự hữu ích. :) Tôi cũng muốn chỉ ra rằng trong trường hợp của tôi nó không phải là makeFirstResponder nhưng resignFirstResponder đã được bao bọc trong hàng đợi Dispatch. – Chris

0

Lệnh này nên được sử dụng trong chế độ xemWillLayout và nếu cần trong viewWillAppear và. Và đó là tất cả. Không có lớp con và chủ đề song song.

[textField.window makeFirstResponder:nil]; 

Điều này làm việc tốt với cửa sổ chính. Nhưng điều này không hoạt động tốt với các cửa sổ phương thức.

Đối với cửa sổ modal sử dụng viewDidAppear hoặc dispatch_async:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [textField.window makeFirstResponder:nil]; 
    }); 
Các vấn đề liên quan