NSTextFieldCell
thừa hưởng từ NSCell
(tốt, về mặt kỹ thuật từ NSActionCell
mà kế thừa từ NSCell
). Lớp NSCell
được sử dụng để (từ docs):
các NSCell lớp cung cấp một cơ chế cho việc hiển thị văn bản hoặc hình ảnh trong một đối tượng NSView mà không có chi phí của một NSView đầy đủ lớp con.
Đáng chú ý, Lớp tế bào được sử dụng cho "hiển thị văn bản hoặc hình ảnh" và không giao tiếp với người dùng. Tương tự, với lớp NSTextField
:
Lớp NSTextField sử dụng lớp NSTextFieldCell để triển khai giao diện người dùng của nó.
Các NSTextField
giao dịch với đầu vào sử dụng thực tế, trong khi sử dụng các tế bào trường văn bản để chỉ đơn giản là thực hiện giao diện người dùng của nó, và tương tự, các phương pháp đại biểu để cung cấp thông báo khi chỉnh sửa các văn bản đã kết thúc được cung cấp thông qua các lớp NSTextField
và không phải thông qua lớp NSTextFieldCell
.
Nếu bạn muốn được thông báo khi chỉnh sửa kết thúc bằng NSTableView
, thì bạn cần đăng ký chính mình làm người quan sát của NSTextDidEndEditingNotification
(bạn có thể muốn đọc tham chiếu lớp NSNotificationCenter nếu bạn không quen với thông báo). Để thực hiện việc này, hãy đặt những điều sau vào lớp điều khiển của bạn; các awakeFromNib
chức năng là một nơi tốt để bao gồm nó để đảm bảo rằng nó được gọi là khi khởi động ứng dụng của bạn:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(textDidEndEditing:)
name:NSTextDidEndEditingNotification
object:tableView];
đâu tableView
là con trỏ đến đối tượng NSTableView
của bạn. Sau đó, bạn chỉ cần thực hiện phương pháp này như sau:
- (void)textDidEndEditing:(NSNotification *)aNotification
{
// Do what you want here
}
Đừng quên để loại bỏ bản thân như một người quan sát trên deallocation:
- (void)dealloc
{
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self];
}
Lý do mà bạn thiết lập các đối tượng mà bạn đang quan sát là NSTableView
instance (và không phải là chính ô) là dưới mui xe, khi bạn chỉnh sửa một ô trong bảng, ô mà bạn đang xử lý không được chỉnh sửa trực tiếp; nó là trình soạn thảo trường của cửa sổ (hoặc tùy chỉnh). Khi chỉnh sửa kết thúc, trình chỉnh sửa trường sau đó chuyển giá trị mới cho ô đó vào chế độ xem bảng. Tuy nhiên, chế độ xem bảng sẽ đăng thông báo để nói rằng một ô đã hoàn tất được chỉnh sửa.
Tôi thấy rằng phương thức "TextDidEndEditing:" hoạt động chứ không phải phương thức "TextDidBeginEditing:". Bạn còn ý kiến nào không? – Yun