StoryBoardを使った場合のTableViewの設定がわからなかったので、作ってみました。
いくつか方法があるようですが、XCodeが作ってくれるテンプレートベースで一番うまくいったやり方です。
必須ではありませんが、今回は曲のデータとして曲名と曲の長さを持つようなクラスをTableViewに表示したいと思います。
class Song: NSObject {
var title : String = "A Song"
var duration : NSTimeInterval = 0.0
}
extension Song {
func durationString() -> String {
return NSString(format:"%i:%02i",Int(self.duration) / 60, Int(self.duration) % 60)
}
}
以下の手順で設定します。
- 1列目の名前をTitle、2列目のタイトルをDurationにします。
- Identity Inspectorで、1列目のIdentifierをTitle、2列目のIdentifierをDurationに設定します。いくつかのコンポーネントから構成されていますから、Outlineで間違えないように選んでください。
- OutlineでTable Viewを選択して、Attribute Inspectorを開いて、Content ModeをCell Basedにします。
- TableViewを選択したまま、Connections Inspectorを開いて dataSourceとdelegateとViewControllerを接続します。
- StoryBoard上のTable Viewをコードエディタ上のViewControllerにドラッグして、NSTableViewのOutletを作成します。
NSTableViewのために2つのメソッドをViewController上に実装する必要があります。
var songs : [Song] = []
func numberOfRowsInTableView(aTableView: NSTableView) -> Int
{
return songs.count
}
numberOfRowsInTableView()では、songsにSongクラスの配列が格納されている前提でその数を返しています。
func tableView(aTableView: NSTableView,
objectValueForTableColumn aTableColumn: NSTableColumn?,
row rowIndex: Int) -> AnyObject?
{
let titleOfSong = songs[rowIndex].title as NSString
let durationOfSong = songs[rowIndex].durationString()
let columnName = aTableColumn?.identifier
if columnName == "Title" {
return titleOfSong
}
else if columnName == "Duration" {
return durationOfSong
}
return ""
}
まず、各行と対応する配列内のSongオブジェクトを取り出しています。 次に渡ってきたTableColumn.identifierを元にどの列をデータが求められているか判断し、曲名と曲の時間を返すようにしています。
func tableViewSelectionDidChange(aNotification: NSNotification)
{
let row = tableView.selectedRow
if row >= 0
{
let selected = songs[row].title as String
NSLog("Selected: \(selected)")
}
}
どうせならTableView上のカーソルの位置に従って曲を選択したアクションをしたいので、tablViewSelectionDidChange()を実装しました。コード例ではログに書き出しているだけですが。