2012-02-27 103 views

回答

69

由于您使用基于NSTableView的观点,你也可以继承NSTableRowView,它养活表委托方法- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row;,然后自定义你在该行视图类的选择。

下面是一个例子:

- (void)drawSelectionInRect:(NSRect)dirtyRect { 
    if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone) { 
     NSRect selectionRect = NSInsetRect(self.bounds, 2.5, 2.5); 
     [[NSColor colorWithCalibratedWhite:.65 alpha:1.0] setStroke]; 
     [[NSColor colorWithCalibratedWhite:.82 alpha:1.0] setFill]; 
     NSBezierPath *selectionPath = [NSBezierPath bezierPathWithRoundedRect:selectionRect xRadius:6 yRadius:6]; 
     [selectionPath fill]; 
     [selectionPath stroke]; 
    } 
} 
+0

谢谢!它像一个魅力! – Dev 2012-03-07 12:39:17

+0

谢谢! :) awesome – 2014-03-04 06:09:38

+5

[WWDC 2011 session 120“基于NSTableView Basic的高级视图”](https://developer.apple.com/videos/wwdc/2011/)给出了一个类似的例子,并且还描述了如何实现不同的颜色,关于该表是否是firstResponder /“主动选择”/“强调”。 – Ashley 2014-08-02 16:50:33

1

在我看来有一个选项可以改变这个因为文件说三种选择风格和默认的风格在常规是蓝色的,看看下面的图像..你需要发送一条消息,我不能图因为我从来没有开发过苹果之前的应用程序..希望这可以帮助...!

enter image description here

+0

你好,'selectionHighlightStyle' _has_值'NSTableViewSelectionHighlightStyleRegular',但我不知道*如何告诉它如何使用_alternate_或_secondary_选择的颜色... – Dev 2012-02-27 13:15:49

+0

这就是我说的,即使我不能弄明白....:P – 2012-02-28 07:44:32

+0

当桌面视图焦点时显示蓝色。如果没有对焦,则显示灰色。没有简单的方法来改变选择颜色。 – jemeshsu 2012-08-27 18:30:58

0

你必须继承NSTableView,并改写以下功能以改变交替的颜色。

  • (void) drawRow: (NSInteger) row clipRect: (NSRect) clipRect

  • (void) drawBackgroundInClipRect: (NSRect) clipRect **此一个改变主及备用颜色**

使用for循环和插入该条件(i % 2 == 0)以检测奇数和偶数行。

+2

为了澄清,这不是针对问题提出的基于视图的NSTableviews的正确答案。你应该只覆盖上面的基于单元格。 – dbainbridge 2013-03-04 14:44:48

12

使用下面的代码响应于所述NSTableViewDelegate协议tableViewSelectionDidChange

获取NSTableRowView对于选择的行和调用该方法setEmphasized就可以了。 当setEmphasized设置为YES时,您会看到蓝色突出显示,否则您会看到灰色突出显示。

-(void)tableViewSelectionDidChange:(NSNotification *)aNotification { 

    NSInteger selectedRow = [myTableView selectedRow]; 
    NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO]; 
    [myRowView setEmphasized:NO]; 
} 
+0

谢谢。这真的是一个有用的答案。 – Vignesh 2014-05-12 08:16:54

+1

这给蓝色和灰色的舞蹈效果......不好的用户体验。 – 2014-08-11 12:15:43

+0

当我们第一次点击该行时,该解决方案不起作用。从第二次点击它将工作。 – CrazyCoder 2015-06-18 13:04:02

-3
- (void)tableViewSelectionDidChange:(NSNotification *)notification 
{ 
    [tblCategory enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row){ 
     CustomMainCell *cellView = [rowView viewAtColumn:0]; 
     if(rowView.selected){ 
      cellView.txtFieldTitle.textColor=[NSColor colorWithCalibratedRed:245.0/255.0 green:110.0/255.0 blue:65.0/255.0 alpha:1.0]; 
     }else{ 
      cellView.txtFieldTitle.textColor=[NSColor whiteColor]; 
     } 
    }]; 
} 

[tblCategory setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];

-3
Use this Notification for NSTableView: 

      - (void)tableViewSelectionDidChange:(NSNotification *)notification 
      { 

       //You Logic stuff 
      } 
6

一些修改让 - 皮埃尔·答案

使用以下响应NSTableViewDelegate协议tableViewSelectionDidChange代码:

获取NSTableRowView对于选择的行并调用该方法setEmphasized就可以了。当setEmphasized设置为YES时,您会看到蓝色突出显示,否则显示灰色突出显示。

-(void)tableViewSelectionDidChange:(NSNotification *)aNotification { 

NSInteger selectedRow = [myTableView selectedRow]; 
NSTableRowView *myRowView = [myTableView rowViewAtRow:selectedRow makeIfNecessary:NO]; 
[myRowView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleRegular]; 
[myRowView setEmphasized:NO]; 
} 

,避免蓝色然后灰集

[_tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone]; 
+0

我的工作,但它最小化应用程序,并再次打开它,它再次它蓝色 – Nininea 2016-11-10 12:36:49

2

在使用雨燕可以在10.10查看基于细胞做

子类NSTableCellView的舞蹈效果,实现这一点:

//override to change background color on highlight 
override var backgroundStyle:NSBackgroundStyle{ 
    //check value when the style was setted 
    didSet{ 
     //if it is dark the cell is highlighted -> apply the app color to it 
     if backgroundStyle == .Dark{ 
      self.layer!.backgroundColor = yourColor 
     } 
     //else go back to the standard color 
     else{ 
      self.layer!.backgroundColor = NSColor.clearColor().CGColor 
     } 
    } 
} 

请注意,NSTableView高亮样式必须设置为Regular,如果它在SourceList上,会导致一些奇怪的剪辑。

这不是最干净的解决方案,但它的作品好就约塞米蒂

+0

它不起作用。 10.10;基于视图的单元; nstablecellview子类与您的代码(但我不得不使用?而不是!'层'后,否则我会崩溃);定期突出风格。 – surfrider 2015-05-03 19:23:03

+0

为我工作。 'Swift 3',Xcode 8.1 – ixany 2016-11-25 09:05:28

+1

这适用于您的单元格之间有空格的情况。默认的高亮颜色显示在单元格背景后面。截图:http://d.pr/i/QzMu1I *(Xcode 8.3.3,Swift 3.1)* – 2017-08-14 23:02:33

1

如前所述,设置强调属性设置为false,但这样做在自定义NSTableRowView类避免副作用(喜欢跳舞的色彩效果):

override func drawRect(dirtyRect: NSRect) { 
     super.drawRect(dirtyRect) 
     self.emphasized = false 

    } 
9

这是James Chen在Swift 3中的解决方案。我还添加了委托方法。

class MyNSTableRowView: NSTableRowView { 

    override func drawSelection(in dirtyRect: NSRect) { 
     if self.selectionHighlightStyle != .none { 
      let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5) 
      NSColor(calibratedWhite: 0.65, alpha: 1).setStroke() 
      NSColor(calibratedWhite: 0.82, alpha: 1).setFill() 
      let selectionPath = NSBezierPath.init(roundedRect: selectionRect, xRadius: 6, yRadius: 6) 
      selectionPath.fill() 
      selectionPath.stroke() 
     } 
    } 
} 

NSTableViewDelegate:

func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? { 
    return MyNSTableRowView() 
} 
+0

谢谢,这对我来说<3 – 2017-10-30 06:43:26

0

好了,所以我知道它已经有一个公认的答案,但对于像我这样的人有NSOutlineView工作,具有.selectionHighlightStyle = .sourceList可以使用此代码来进行选择灰色。此方法在更改选择时不会闪烁,并且在应用程序最小化时也会保持灰色。

NSTableView的/ NSOutlineView代表:

func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView? 
{ 
    let row : CustomRowView = CustomRowView.init() 
    row.identifier = "row" 

    return row 
} 

,然后创建一个新的文件CustomRowView.swift此:

class CustomRowView : NSTableRowView 
{ 
    override var isEmphasized: Bool { 
     get { return self.isEmphasized } 
     set(isEmp) { self.isEmphasized = false } 
    } 
} 

这将让选择灰色的时刻。

-1

这是让 - 皮埃尔在Swift3回答:

func tableViewSelectionDidChange(_ notification: Notification) 
    { 
     index = tableView.selectedRow 
     let rowView = tableView.rowView(atRow: index, makeIfNecessary: false) 
     rowView?.isEmphasized = false 
... 

它上面列出的两个限制 - 第一次点击不起作用,第二次点击一样。而且,还有一种“跳舞效应”。我不介意第一个,也不喜欢第二个。

0

我已经混合了前面描述过的所有方法,并获得了完全按照我的意愿做的代码。

  • 选择内容不会改变文本字段的颜色;
  • 行记得一个的选择和颜色;
  • 出现任何奇怪的外边框和其他剩菜。

    class AudioCellView: NSTableRowView { 
    ... 
    override func draw(_ dirtyRect: NSRect) { 
        super.draw(dirtyRect) 
        self.wantsLayer = true 
        self.layer?.backgroundColor = NSColor.white.cgColor 
    } 
    
    override var isEmphasized: Bool { 
        set {} 
        get { 
         return false 
        } 
    } 
    
    override var selectionHighlightStyle: NSTableViewSelectionHighlightStyle { 
        set {} 
        get { 
         return .regular 
        } 
    } 
    
    override func drawSelection(in dirtyRect: NSRect) { 
        if self.selectionHighlightStyle != .none { 
         let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5) 
         NSColor(calibratedWhite: 0.85, alpha: 0.6).setFill() 
         let selectionPath = NSBezierPath.init(rect: selectionRect) 
         selectionPath.fill() 
        } 
    }