6

iOS アプリケーションを Mac に移植しようとしていますが、移行中にいくつかの問題に遭遇しました。のカスタマイズもその一つですNSTableViewNSCellNSTableRowViewカスタムNSViewベースの違いは何NSTableviewですか? 最初はビュー ベースNSTableViewで始めましたが、選択を自分で処理する必要があることにすぐに気付きました。私はそれをやってのけることができなかったのでNSTableRowView、奇妙なことに、カスタムの初期化子を呼び出さないを使用し続けましたNSTableRowView

基本的に、選択可能なカスタム コンテンツを含むカスタム テーブル ビュー セルが必要です。それを行う最良の方法は何ですか?

iOS では、サブクラスUITableViewCell化して selectedView プロパティを設定するだけです。Mac では、これはそれよりも複雑なようです。

4

4 に答える 4

4

NSTableViewDelegate プロトコル tableViewSelectionDidChange への応答として、次のコードを使用します。

選択した行の NSTableRowView を取得し、setEmphasized メソッドを呼び出します。setEmphasized が YES に設定されている場合は青色のハイライトが表示され、NO の場合は灰色のハイライトが表示されます。

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

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

そして、青とグレーのセットのダンス効果を避けるために

[_tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
于 2014-12-04T07:50:49.527 に答える
2

Swift での the_critic のソリューション: (XCode 7 beta3、Swift 2.0 でテスト済み)

class CustomTableRowView: NSTableRowView {

    override var selected: Bool {
        willSet(newValue) {
            super.selected = newValue;
            needsDisplay = true
        }
    }

    override func drawBackgroundInRect(dirtyRect: NSRect) {
        let context: CGContextRef = NSGraphicsContext.currentContext()!.CGContext

        if !self.selected {
            CGContextSetFillColorWithColor(context, NSColor.clearColor().CGColor)
        } else {
            CGContextSetFillColorWithColor(context, NSColor.redColor().CGColor)
        }

        CGContextFillRect(context, dirtyRect)
    }

}

ビューコントローラー:

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

    // [...]

    func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
        guard let rowView = tableView.makeViewWithIdentifier("RowView", owner: nil) as! CustomTableRowView? else {
            let rowView = CustomTableRowView()
            rowView.identifier = "RowView"
            return rowView
        }

        return rowView
    }

}
于 2015-07-21T06:46:52.127 に答える