2010-03-07 33 views
9

Tôi gặp sự cố khi sắp xếp nội dung NSTableColumn. Trong NSTableView của tôi có ba cột: File, Size, Path. Các nội dung được lưu trữ trong NSMutableArray. Mỗi đối tượng trong mảng này là một NSDictionary chứa ba khóa: tệp, kích thước và đường dẫn - giá trị cho mỗi đối tượng là một NSString.Sắp xếp nội dung NSTableColumn

Trong bộ dựng giao diện, trong mỗi thuộc tính Cột của bảng, tôi có thể chọn tùy chọn sắp xếp: Bộ chọn: IB đã nhập "so sánh:" mà tôi nghĩ là ok, vì tôi so sánh NSStrings. Sắp xếp khóa - và đó là vấn đề tôi nghĩ - tôi không biết phải nhập gì vào đây.

Bất kỳ manh mối nào? Nếu bạn có câu hỏi về mã của tôi, vui lòng hỏi.

Trả lời

11

Vì vậy, tôi đã tìm thấy giải pháp hoàn chỉnh.

Trước tiên, hãy chuyển đến Trình tạo giao diện. Chọn cột bạn muốn sắp xếp. Đi đến thanh tra của cột và chọn nút đầu tiên để xem "Thuộc tính Cột Bảng". Đặt giá trị thích hợp (theo nghĩa đen, không có "hay" hoặc @ là cần thiết):

Sort key: file 

nơi 'tập tin' là chìa khóa của từ điển mà nội dung được hiển thị trong cột của bạn

Selector: compare: 

chức năng sắp xếp tiêu chuẩn .

Bây giờ, lưu tất cả những thay đổi ở đây và nhảy đến Xcode, đến lớp, trong đó là các mô hình, nguồn gốc của dữ liệu thể hiện trong NSTableView bạn nên đã biết rằng bạn cần hai phương pháp đó:.

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView 
-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn 
*)tableColumn row:(NSInteger)row 

hai yêu cầu này là cần thiết để tuân thủ giao thức không chính thức của NSTableDataSource. Bạn có thể đọc về nó tại Trung tâm MacDev.

Bây giờ tất cả bạn phải làm là thêm một phương pháp mới:

-(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange: (NSArray *)oldDescriptors 

nó có thể chứa một mã rất đơn giản mà sẽ làm điều:

-(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange: (NSArray *)oldDescriptors 
{  
    NSArray *newDescriptors = [tableView sortDescriptors]; 
    [results sortUsingDescriptors:newDescriptors]; 
    //"results" is my NSMutableArray which is set to be the data source for the NSTableView object. 
    [tableView reloadData]; 
} 

Và đó là tất cả. Nó hoạt động trong ứng dụng của tôi, hy vọng nó sẽ hoạt động trong trường hợp của bạn: D Mọi thứ sẽ hoạt động tự động. Tôi vừa lưu tất cả các tệp và đã xây dựng ứng dụng. Va no đa hoạt động.:)

trang web đó đã giúp tôi: CocoaDev: SortingNSTableView

+0

Bạn đã lưu ngày của tôi! – 11684

+0

Bạn được chào đón! –

+0

Awsumly đã cứu tôi khỏi bị điên ... :) –

2

Khóa là key mà bạn sử dụng trong từ điển để truy xuất giá trị.

Trong trường hợp của bạn, bạn có ba khóa: tệp, kích thước và đường dẫn. Chọn tùy chọn bạn muốn sắp xếp. Phím được sử dụng để lấy giá trị từ mỗi bản ghi được sử dụng để phân loại.

Nếu khóa của bạn là @ "tệp", @ "size", @ "path" và bạn muốn sắp xếp theo số file thì hãy thử đặt value.file vào trường Sort Key trong IB.

Sử dụng các phím bạn sử dụng khi chèn values vào NSDictionary của mình.

+0

Cảm ơn bạn đã trả lời nhưng tôi không se câu trả lời. Tôi thấy cửa sổ này: http://homepage.mac.com/simx/.Pictures/column_attributes.png Tôi có cảm giác dễ dàng hơn việc thêm một đoạn mã vào ứng dụng của tôi. Bạn nghĩ gì tôi nên nhập vào trường 'Phím sắp xếp'? –

+0

** Đã chỉnh sửa **: đã xóa ví dụ về mã 'khó hiểu ', nó chỉ cho bạn cách nó được thực hiện trong mã để bạn thấy kết nối giữa các giá trị và mã IB. Nhưng thấy rằng nó làm phức tạp những thứ tôi đã xóa nó. Vì vậy, bây giờ nó nên được rõ ràng những gì bạn nên chèn vào IB. – stefanB

+0

Không hoạt động. Tôi đã thử những điều này: - valueForKey: @ "đường dẫn" - objectForKey: @ "tệp" - value.objectForKey: @ "tệp" Không có cách nào hoạt động .. Không biết phải làm gì. Có lẽ tôi nên tạo ra một số ràng buộc hay gì đó? Từ quan điểm của ai, tôi nên viết chìa khóa này? –

Các vấn đề liên quan