2010-04-13 21 views
5

Trước hết tôi mới để phát triển ca cao vì vậy tôi cho rằng tôi đang có lẽ cố gắng để làm điều này một cách sai lầm, nhưng ở đây đi:Mở rộng tất cả các mục của một NSOutlineView rằng tải dữ liệu từ một nguồn dữ liệu

tôi có NSOutlineView tải dữ liệu từ việc triển khai NSOutlineViewDataSource. Tôi muốn tất cả các mục được mở rộng sau khi chúng được tải, nhưng tôi dường như không thể tìm thấy sự kiện được kích hoạt khi dữ liệu đã tải xong, vì vậy tôi có thể gửi [outlineView expandItem: nil expandChildren: YES] cho nó.

Tôi đã xem giao thức NSOutlineViewDelegate nhưng tôi không thể tìm thấy địa điểm phù hợp cho cuộc gọi này. Cách tiếp cận tốt nhất cho vấn đề này là gì?

Trả lời

1

Đây là cách tôi thường xử lý việc này. Tôi thích tự hiển thị cửa sổ chính của mình thay vì để nó tự động diễn ra. Điều này cho phép tôi đảm bảo tất cả các mục giao diện của tôi được thiết lập như thế nào tôi muốn trước khi tôi hiển thị cho người dùng cửa sổ. Có vẻ như bạn cũng có thể làm điều này. Vì vậy, đầu tiên tôi bỏ chọn "Visible at launch" trong trình tạo giao diện cho cửa sổ. Sau đó, trong lớp đại biểu ứng dụng của tôi của tôi sử dụng phương pháp này là một phương pháp deleate của NSApplication:

  • (void) applicationDidFinishLaunching: (NSNotification *) aNotification

Trong đó tôi thiết lập mục giao diện của tôi, vì ở đó tôi biết mọi thứ đều được tải. Và sau đó dòng cuối cùng của phương thức đó sẽ là: [myWindow makeKeyAndOrderFront: self] ;. Bằng cách này bạn biết cửa sổ của bạn là hoàn hảo trước khi người dùng của bạn nhìn thấy cửa sổ. Vì vậy, tôi sẽ thử phương pháp của bạn ở đó.

+0

cảm ơn, nhưng đây không phải là giải pháp cho tôi vì bảng xếp hạng xuất hiện khi người dùng nhấp vào nút và dữ liệu dường như được tải khi bảng điều khiển hiển thị, chứ không phải khi ứng dụng khởi chạy – matei

1

Tôi đã tìm thấy câu trả lời. Dường như việc thực hiện các phương pháp đại biểu -(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item sẽ làm các trick:


-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 
{ 
    [outlineView expandItem:item]; 
} 
+0

sau chỉnh sửa: đây không phải là một câu trả lời hay, có vẻ như sẽ làm hỏng các mục cuối cùng trong outlineview và không hiển thị chúng vì vậy bất kỳ sự trợ giúp nào sẽ được đánh giá cao – matei

3

Giải pháp tốt nhất mà tôi đã đưa ra là để viết một phương pháp mà mở rộng NSOutlineView sau khi một sự chậm trễ của zero.

- (void)windowDidLoad 
{ 
    [super windowDidLoad]; 
    [self performSelector:@selector(expandSourceList) withObject:nil afterDelay:0.0]; 
} 

- (IBAction)expandSourceList 
{ 
    [mSourceListView expandItem:nil expandChildren:YES]; 
} 
+0

Cảm ơn bạn đã đề xuất sử dụng 'windowDidLoad': loại thiết lập này. Nhưng, bằng cách này, tôi đã tìm thấy rằng tôi không cần phải sử dụng sự chậm trễ, ít nhất là cho những gì tôi đang cố gắng làm: Tôi đang gọi '-expandItem:' trực tiếp từ 'windowDidLoad', và cho đến nay , điều này dường như hoạt động. Có lẽ do một trong những điều sau đây: Tôi đang ở 10.9.3; Tôi chỉ mở rộng các hàng nhất định, vì vậy tôi đang cung cấp các mục cụ thể cho '-expandItem:' thay vì 'nil' ...? – Ashley

6

Bình thường, tôi muốn làm một cái gì đó giống như hình thức bên này - awakeFromNib hoặc bất kỳ callbacks khởi động khác

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.outlineView expandItem:root expandChildren:YES]; 
}); 

này sẽ enqueue khối thực hiện ở phần cuối của chu kỳ hiện tại trong runloop, do đó, nó sẽ được thực hiện sau khi tất cả khởi tạo đã diễn ra. Không cần phải đặt bất kỳ sự chậm trễ nhân tạo nào.

+0

Không chắc chắn lý do tại sao điều này đã được bình chọn. Điều này làm việc cho tôi khi các giải pháp khác tôi có thể tìm thấy thất bại. Cảm ơn! –

+0

Câu trả lời hay nhất! :) cái này hoạt động bất kể ngữ cảnh. – Kappe

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