2016-03-15 50 views
1

我想將NSTableView的行復制到剪貼板上。這裏是我的代碼:實現複製方法 - 複製整行

- (void) copy:(id)sender 
{ 
    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; 
    // I get warning in the line bellow, unused variable changeCount 
    NSInteger changeCount = [pasteboard clearContents]; 
    NSInteger row = [self.customersViewController.customersTableView selectedRow]; 
    NSTableColumn *columnFirstName = [self.customersViewController.customersTableView tableColumnWithIdentifier:@"firstName"]; 
    NSCell *cellFirstName = [columnFirstName dataCellForRow:row]; 
    NSArray *objectsToCopy = @[[cellFirstName stringValue]]; 
    // I get warning in the line bellow unused variable OK 
    BOOL OK = [pasteboard writeObjects:objectsToCopy]; 
} 

此代碼的工作,如果我選擇在NSTableView的行,選定行的名字列的內容確實是在紙板(我可以粘貼在文本編輯器中值)。

然而這段代碼有幾個問題:

1.我得到2個警告,你可以從我的comments.I看到重寫擺脫這樣的警告的代碼。我如何重寫代碼的方式有什麼問題嗎?

// warning one 
NSInteger changeCount = 0; 
changeCount = [pasteboard clearContents]; 

// warning 2 
BOOL OK = NO; 
OK = [pasteboard writeObjects:objectsToCopy]; 
  • 在上面的代碼我的名字具體其中NSTableView的我使用

    ... self.customersViewController.customersTableViev ....

  • 但是,如果用戶切換視圖,它可能會使用一些其他NSTableView ...我怎樣才能找出從哪個NSTableView複製方法應該複製噸他排?

    如果我評論我使用特定NSTableView並嘗試使用發件人的行,我的應用程序崩潰。

    //NSInteger row = [self.customersViewController.customersTableView selectedRow]; 
    NSInteger row = [sender selectedRow]; 
    

    3.我該如何編寫一個循環來獲取所有列名,而不是專門用手寫一個一個的?我不知道哪個NSTableView的,則還是使用....

    NSTableColumn *columnFirstName = [self.customersViewController.customersTableView tableColumnWithIdentifier:@"firstName"]; 
    
    +0

    你想要什麼粘貼,以哪種方式及順序? – Willeke

    +0

    對問題1的回答:[如何在XCode中掩蓋不需要的「Dead Store」警告?](http://stackoverflow.com/questions/5294761/how-to-mask-an-unwanted-dead-store-warning- in-xcode) – Willeke

    +0

    數據源或綁定?基於單元格還是基於視圖? – Willeke

    回答

    2
    1. 如果你不想讓你可以忽略它的返回值。

    2. 要使代碼表視圖獨立,可以使用窗口的firstResponder。或者,您可以在NSTableView的小類中實現copy:sender是菜單項。

    3. NSTableView的財產tableColumnsNSTableColumn的數組。

    這裏就是我所做的:

    - (void)copy:(id)sender { 
        NSResponder *firstResponder = self.window.firstResponder; 
        if (firstResponder && [firstResponder isKindOfClass:[NSTableView class]]) { 
         NSTableView *tableView = (NSTableView *)firstResponder; 
         NSArrayController *arrayController = [[tableView infoForBinding:NSContentBinding] objectForKey:NSObservedObjectKey]; 
         // create an array of the keys and formatters of the columns 
         NSMutableArray *keys = [NSMutableArray array]; 
         for (NSTableColumn *column in [tableView tableColumns]) { 
          NSString *key = [[column infoForBinding:NSValueBinding] objectForKey:NSObservedKeyPathKey]; // "arrangedObjects.name" 
          if (key) { 
           NSRange range = [key rangeOfString:@"."]; 
           if (range.location != NSNotFound) 
            key = [key substringFromIndex:range.location + 1]; 
           NSFormatter *formatter = [[column dataCell] formatter]; 
           if (formatter) 
            [keys addObject:@{@"key":key, @"formatter":formatter}]; 
           else 
            [keys addObject:@{@"key":key}]; 
          } 
         } 
         // create a tab separated string 
         NSMutableString *string = [NSMutableString string]; 
         for (id object in [arrayController selectedObjects]) { 
          for (NSDictionary *dictionary in keys) { 
           id value = [object valueForKeyPath:dictionary[@"key"]]; 
           if (value) { 
            NSFormatter *formatter = [dictionary objectForKey:@"formatter"]; 
            if (formatter) 
             [string appendFormat:@"%@\t", [formatter stringForObjectValue:value]]; 
            else 
             [string appendFormat:@"%@\t", value]; 
           } 
           else 
            [string appendFormat:@"\t"]; 
          } 
          [string replaceCharactersInRange:NSMakeRange([string length] - 1, 1) withString:@"\n"]; 
         } 
         NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; 
         [pasteboard clearContents]; 
         [pasteboard setString:string forType:NSPasteboardTypeString]; 
        } 
    } 
    
    +0

    工程就像一個魅力。現在我將逐行研究這些代碼,希望能夠在未來學會如何解決類似的問題。謝謝。 – user2417624