2016-06-29 14 views
0

NSTableViewに表示する行がない場合は、代わりに画像を表示したいと思います。カスタムNSViewControllerクラスで次のように試しましたが、空のテーブルがまだ表示されます。私はAssets.xcassetsに "ic_empty_image"を持っています。NSTableView:画像で空のテーブルを置き換えます

func numberOfRowsInTableView(tableView: NSTableView) -> Int { 
    if model.numRows == 0 { 
     let image = NSImage(named: "ic_empty_image") 
     let imageView = NSImageView() 
     imageView.image = image 
     self.view.replaceSubview(tableView, with: imageView) 
     self.view.setNeedsDisplayInRect(imageView.visibleRect) 
    } else { 
     return model.numRows 
    } 
} 

答えて

1

ビューベースのテーブルを利用する場合は、空のデータセットがあることがわかっているときにセルの表示を反転することができます。トリックはあなたのテーブルを配列にバインドし、それを空にする代わりに1つの項目インジケータを持つことです。

私はここにあなたのためのサンプルプロジェクトを作成しました:

https://github.com/emankovski/nstableview-empty-picture

しかし、一般的なロジックは、実際にはかなり簡単です:私はペン先にNSTableCellViewオブジェクトを作成し、私はデータなしの指標を見ると、ちょうどそれを返します。また、テーブルビューの行の高さをテキストセルを持つセルよりもイメージの方が大きいセルに変更することに注意してください。私はそれが助けて欲しいストーリーボード用

class AppDelegate: NSObject, NSApplicationDelegate, NSTableViewDataSource { 

private static let placeholder = "<Placeholder>" 
dynamic var items = [String]() 

@IBOutlet weak var window: NSWindow! 
@IBOutlet weak var tableView: NSTableView! 
@IBOutlet weak var imageCell: NSTableCellView! 

@IBAction func addRowsPressed(sender: AnyObject) { 
    appendItems() 
} 

@IBAction func clearTablePressed(sender: AnyObject) { 
    removeItems() 

} 

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    appendItems() 

} 

func applicationWillTerminate(aNotification: NSNotification) { 
    // Insert code here to tear down your application 
} 

func appendItems() { 


    items.removeAll() 

    items.append("One") 
    items.append("Two") 
    items.append("Three") 

    tableView.rowHeight = 20 

} 

func removeItems() { 

    items.removeAll() 
    tableView.rowHeight = 50 
    items.append(AppDelegate.placeholder) 


} 

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { 

    if items[row] == AppDelegate.placeholder { 

     return imageCell 
    } 

    let cellView = tableView.makeViewWithIdentifier("CellView", owner: nil) as! NSTableCellView 

    return cellView 
} 


} 

UPDATE:ストーリーボードコントローラを表示するために、表のセルの表示をドラッグする方法の 写真:

enter image description here

それからちょうどその出口へのオブジェクトのドラッグを接続する出口を作成し

@IBOutlet var tableCellView: NSTableCellView! 
+0

これは有望そうです。私はxibではなくストーリーボードを使用していますが、cellViewとimageViewの間でテーブルの列を切り替える方法はありますか?イメージセルを自分の列にドラッグしようとしましたが、既存のテキストセルを置き換えます。 – Ravi

+0

オブジェクトライブラリからテーブル(ビューまたはイメージ)をテーブルにドラッグするのではなく、ビューコントローラがリストされているドキュメントのアウトライン領域にドラッグします。コントローラを表示するあなたの兄弟にドラッグします。 –

+0

私はストーリーボードの指示で私の答えを更新します。 –

-1

テーブルビューを置き換えるのではなく、単にtableViewと画像ビューの隠しプロパティで再生することができます。

これはあなたのベースクラスは、(それをテストしていない)、これは動作するはずです場合でものUIViewController

private var imageView: UIImageView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let image = NSImage(named: "ic_empty_image") 
     let imageView = NSImageView() 
     imageView.frame = tableView.frame 
     imageView.image = image 
     self.view.addSubview(imageView) 
     imageView.hidden = true 
    } 

    func numberOfRowsInTableView(tableView: NSTableView) -> Int { 
     if model.numRows == 0 { 
      tableView.hidden = true 
      imageView.hidden = false 
      return 0 // Table view will still be active and therefore we need to give it return value 
     } else { 
      tableView.hidden = false 
      imageView.hidden = true 
      return model.numRows 
     } 
    } 

であれば、私はこの道を行くお勧めしません動作します。より良い方法がいくつかあります(必要なものによって異なります)。

UITableViewControllerを使用している場合は、UITableViewの行数に基づいて背景イメージを追加できます。ストーリーボードやxibsを使っている場合は、imageViewを作成してイメージを追加することができます。行数に基づいてイメージビューを表示/非表示するだけで済みます。

+0

なぜこの回答をお勧めしないのですか? – Willeke

+0

この回答はほとんど動作します。しかし、それは隠されたビューを短く点滅させます。 – Ravi

関連する問題