2012-09-04 20 views
5

Tôi đang gặp vấn đề với NSTableView dựa trên lượt xem đang chạy trên 10,8 (mục tiêu là 10,7, nhưng tôi nghĩ điều này không liên quan).Cách kích hoạt một hành động từ NSTableCellView trong chế độ xem dựa trên NSTableView khi sử dụng các ràng buộc

Tôi đang sử dụng NSTableView và tôi nhận được giá trị nội dung cho NSTableCellView tùy chỉnh của mình thông qua các ràng buộc. Tôi sử dụng obejctValue của NSTableCellView để lấy dữ liệu của tôi.

Tôi đã thêm một nút vào ô của mình và tôi muốn nó kích hoạt một số hành động khi được nhấp. Cho đến nay tôi chỉ có thể kích hoạt một hành động trong lớp con của NSTableCellView tùy chỉnh.

tôi có thể nhận được hàng đó được nhấp như thế này, bằng cách sử dụng chuỗi:

NSButton *myButton = (NSButton*)sender;  

NSTableView *myView = (NSTableView*)myButton.superview.superview.superview; 

NSInteger rowClicked = [myView rowForView:myButton.superview]; 

Từ đó tôi không biết làm thế nào để đạt được App đại biểu hoặc điều khiển của tôi nơi hành động được xác định.

Vì tôi đang sử dụng kết buộc cacao, tôi không có đại biểu trên NSTableView mà tôi có thể sử dụng để kích hoạt hành động của mình.

Bạn có ý tưởng nào về cách tôi có thể nói chuyện lại với bộ điều khiển không?

Rất cám ơn trước!

Trả lời

2

Mặc dù bạn đang sử dụng các ràng buộc, bạn vẫn có thể đặt bộ điều khiển làm đại biểu cho tableview của bạn trong trình tạo giao diện.

Tôi thấy rằng bạn đã có thể truy cập chế độ xem bảng từ bên trong ô của bạn. Nhiệm vụ tiếp theo phải đơn giản, chỉ cần đặt ủy nhiệm xem bảng làm mục tiêu cho hành động của nút.

+0

Cảm ơn, đã tìm thấy cách bạn nói. Trên thực tế đã được bối rối lúc đầu tiên bằng cách cung cấp các tế bào. Nhưng nó hoạt động tốt. –

3

Cảm ơn câu hỏi của bạn, tôi cũng sẽ kích hoạt một hành động từ một nút trên NSTableView. Câu hỏi của bạn đã giúp tôi đi đúng hướng.

Trước tiên hãy giải quyết giải pháp của bạn để tìm ra số hàng mà NSTableView của tôi đang bật. Tôi đã có thể tìm thấy nó mà không biết nút, trong tùy chỉnh của tôi NSTableView Tôi đã cài đặt sau đây là một nỗ lực đầu tiên:

- (NSInteger)myRowNumber 
{ 
    return [(NSTableView*)self.superview.superview rowForView:self]; 
} 

này hoạt động tốt, tuy nhiên nó là ít hơn mạnh mẽ. Nó chỉ hoạt động nếu bạn đã biết cụ thể mức độ sâu sắc của bạn trong hệ thống phân cấp khung nhìn. Giải pháp mạnh mẽ và phổ quát hơn là:

- (NSInteger)myRowNumber 
{ 
    NSTableView* tableView = nil; 
    NSView* mySuperview = self; 

    do 
    { 
     NSView* nextSuper = mySuperview.superview; 
     if (nextSuper == nil) 
     { 
      NSException *exception = 
       [NSException exceptionWithName:@"NSTableView not found." 
        reason:[NSString stringWithFormat:@"%@ search went too deep.", 
        NSStringFromSelector(_cmd)] userInfo:nil]; 
      @throw exception; 
     } 

     if ([nextSuper isKindOfClass:[NSTableView class]]) 
      tableView = (NSTableView*)nextSuper; 
     else 
      mySuperview = mySuperview.superview; 
    } while (tableView == nil); 

    return [tableView rowForView:self]; 
} 

điều này không chỉ hoạt động ở cấp NSTableView, bất kể phân cấp khung nhìn phức tạp như thế nào.

Đối với phần chưa được trả lời của câu hỏi, tôi đã thiết lập IBOutlet trong lớp và sử dụng trình tạo giao diện được gắn với chủ sở hữu tệp của tôi (trong trường hợp của tôi là lớp tài liệu). Một khi tôi đã có một tham chiếu đến lớp tôi đã gửi tin nhắn của tôi đến, và số hàng, tôi gọi chức năng. Trong trường hợp của tôi, cuộc gọi yêu cầu tôi vượt qua số hàng mà nó bắt nguồn từ đó.

[self.myDoc doSomethingToRow:self.myRowNumber]; 

Tôi đã thử nghiệm tính năng này và hoạt động ở các cấp phân cấp chế độ xem khác nhau trên NSTableView. Và nó hoạt động mà không cần phải chọn hàng đầu tiên (có vẻ như được giả định trong tài liệu của Apple).

Kính trọng, George Lawrence Storm, Maltby, Washington, USA

1

Sử dụng rowForView: và chuỗi responder

Để đáp ứng với hành động của một người điều khiển nhúng trong một NSTableCellView, sự kiểm soát cần ban hành các hành động cho Đầu tiên Responder. Ngoài ra, Chủ sở hữu tệp là có thể nhưng điều này được kết hợp chặt chẽ hơn.

Sử dụng rowForView: bên trong phương thức hành động để xác định hàng của kiểm soát ban hành các hành động:

- (IBAction)revealInFinder:(id)sender { 
    NSInteger row = [self.tableView rowForView:sender]; 
    ... 
} 

Hành vi được thực hiện trong bất kỳ của các lớp chuỗi trả lời. Rất có thể, đây sẽ là trường hợp NSWindowController được phân loại của bạn. Người trả lời cũng có thể là đại biểu ứng dụng; giả sử đại biểu có phương tiện để nói chuyện với NSTableView.

Xem ví dụ của Apple TableViewPlayground: Using View-Based NSTableView and NSOutlineView để xem tính năng này hoạt động.