2009-05-27 28 views
10

Tôi có ô trường văn bản trong chế độ xem bảng, từ đó tôi cần được nhận biết khi kết thúc chỉnh sửa. Tôi nghĩ rằng tôi sẽ thiết lập lớp điều khiển của tôi là đại biểu của trường văn bản, và sau đó sử dụng phương thức ủy nhiệm của NSTextField textDidEndEditing :, nhưng nhận ra rằng ô trường văn bản dường như không có phương thức đại biểu? Tại sao điều này, và những gì tôi có thể làm (khác hơn là phân lớp) để được thông báo khi chỉnh sửa xong?NSTextFieldCell Delegate?

Cảm ơn

Trả lời

14

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 NSTextFieldkhô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.

+0

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

0

Triển khai phương thức tableView:setObjectValue:forTableColumn:row: trong giao thức NSTableViewDataSource. Đặt nó bên cạnh phương pháp tableView:objectValueForTableColumn:row: mà bạn đã triển khai.

- (void)tableView:(NSTableView *)aTableView 
    setObjectValue:(id)anObject 
    forTableColumn:(NSTableColumn *)aTableColumn 
       row:(NSInteger)rowIndex 
{ 
    [mutableArrayWithStrings replaceObjectAtIndex:rowIndex withObject:anObject]; 
} 
Các vấn đề liên quan