2015-04-24 20 views
5

Tôi có NSTableView trong đó tôi thay đổi màu của văn bản trong một cột cụ thể, nhưng khi một hàng được chọn, văn bản không thay đổi thành màu phù hợp hơn rằng nó có thể đọc được.Cách đảo màu chữ của hàng NSTableView được chọn

Cột Ngày sửa đổi, Kích thước và Loại của người tìm có văn bản màu xám và khi bạn chọn hàng tệp/thư mục, văn bản màu xám chuyển thành màu trắng (để có thể đọc được trong phần đánh dấu màu xanh lam).

Tôi không thể tìm thấy hộp kiểm ma thuật trên XCode để bật hành vi này theo mặc định, vì vậy, không ai biết cách tôi có thể đạt được hiệu ứng tương tự?

Tôi đang sử dụng Swift trong XCode 6.3.

Cảm ơn.

Trả lời

14

Bạn không nói phân cấp chế độ xem hoặc chế độ xem bạn đang sử dụng cho các ô của mình. Bạn cũng không nói như thế nào hoặc nơi bạn đang thiết lập màu của trường văn bản hoặc màu nào, cụ thể.

Khi một hàng được chọn, hàng sẽ tự động tính interiorBackgroundStyle của nó. Nó cũng đặt backgroundStyle của chế độ xem ô nếu nó phản hồi -setBackgroundStyle: hoặc là một NSControl với ô phản hồi điều đó.

Nếu chế độ xem ô của bạn là phiên bản NSTableCellView, nó sẽ chuyển tiếp kiểu nền cho tất cả các bản xem phụ đáp ứng cùng tiêu chí. Nếu bạn sử dụng chế độ xem vùng chứa khác làm chế độ xem ô của mình và bạn muốn kiểu nền được chuyển tiếp như thế này, bạn sẽ phải thực hiện chính nó trong lớp chế độ xem của mình.

Một ô của NSTextField (an NSTextFieldCell) phản hồi -setBackgroundStyle: và do đó có kiểu nền được đặt tự động theo các cơ chế ở trên. Ô trường văn bản sẽ tự động thay đổi màu văn bản thành màu trắng nếu màu textColor là một trong các màu điều khiển tiêu chuẩn (ví dụ: NSColor.controlTextColor()), nhưng sẽ không làm như vậy nếu bạn gán màu không chuẩn. Vì vậy, nếu bạn đang thiết lập một màu cụ thể cho văn bản của mình, bạn có trách nhiệm thay đổi điều đó khi kiểu nền thay đổi.

Bạn có thể sử dụng phân lớp NSTableCellView và thêm người quan sát thuộc tính (didSet) cho thuộc tính backgroundStyle. Điều đó có thể thay đổi trường văn bản textColor tùy thuộc vào kiểu đã được đặt. Ví dụ: bạn có thể sử dụng màu tùy chỉnh của mình nếu kiểu nền không phải là .Dark hoặc sử dụng màu trường văn bản bình thường NSColor.controlTextColor() nếu đó là .Dark (để trường văn bản sẽ hiển thị màu trắng).

Bạn cũng có thể sử dụng lớp con của NSTextFieldCell cho trường văn bản của mình và thực hiện cùng một loại điều. Hoặc ghi đè drawInteriorWithFrame(_:inView:) để vẽ bằng màu văn bản khác tùy thuộc vào kiểu nền.

+0

Trong bảngXem: viewForTableColumn: row: delegate method Tôi đang thực hiện việc này để đặt màu của trường văn bản trong ô dựa trên khung nhìn của tôi: cell.textField! .textColor = NSColor.redColor(). Các ô được đặt thành blackColor() đảo ngược tốt, nhưng redColor() thì không. Câu trả lời của bạn sẽ mất một thời gian để tìm ra, vì vậy cảm ơn vì đã cho tôi một số ý tưởng để xem xét. –

+0

Anh bạn, tôi sẽ kiểm tra, nhưng nếu điều này làm bạn là vị cứu tinh của tôi !! AppKit quá kỳ lạ khi đến từ UIKit :) – Frizlab

+0

Nó hoạt động! \ o/Tuyệt vời. – Frizlab

4

Với sự giúp đỡ của phản ứng của Ken (ở trên) tôi đã có thể có được nó để làm việc. Đây là một bản nháp thực hiện những gì tôi muốn:

import Cocoa 

class CustomTextFieldCell: NSTextFieldCell { 

    // When the background changes (as a result of selection/deselection) switch appropriate colours 
    override var backgroundStyle: NSBackgroundStyle { 
     didSet { 
      if (backgroundStyle == NSBackgroundStyle.Dark) { 
       if self.textColor == NSColor.redColor() { 
        self.textColor = NSColor.yellowColor() 
       } 
      } else if (backgroundStyle == NSBackgroundStyle.Light) { 
       if (self.textColor == NSColor.yellowColor()) { 
        self.textColor = NSColor.redColor() 
       } 
      } 
     } 
    } 

    // When the colour changes, switch to a better alternative for the cell's current background 
    override var textColor: NSColor? { 
     didSet { 
      if let colour = self.textColor { 
       if backgroundStyle == NSBackgroundStyle.Dark { 
        if self.textColor == NSColor.redColor() { 
         self.textColor = NSColor.yellowColor() 
        } 
       } else if backgroundStyle == NSBackgroundStyle.Light { 
        if (self.textColor == NSColor.yellowColor()) { 
         self.textColor = NSColor.redColor() 
        } 
       } 
      } 
     } 
    } 

} 

Nếu tôi đặt CustomTextFieldCell làm lớp tùy chỉnh cho ô xem bảng của tôi trong trình kiểm tra nhận dạng, nó hoạt động. Tôi cũng cần thêm một người quan sát thuộc tính cho textColor để các hàng hiện đang được đánh dấu có cùng một cách xử lý. Tôi có thể thay đổi nó ngay bây giờ để nó không khó mã hóa nhưng điều này chứng tỏ khái niệm.

Cảm ơn Ken.

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