Swift

Swift:view basedの表

以前チャレンジして挫折したview basedのNSTableViewに再チャレンジしています。

OS X NSTableView TutorialGetting Started With OS X and Swift Tutorialに出ているサンプルコードを調査しました。後者の方が行数が少なくてわかりやすいです。

気がついた点は次の通りです。

追記(3/28/2016):Interface Builderで次のような接続にしないと、wkArray配列(NSMutableArray)を更新し、xTableView?.reloadData()を実行しても、tableViewに制御が渡ってきませんでした。

Screenshot 2016-03-28 03.10.00

MasterViewControllerに関して

  • extension MasterViewController: NSTableViewDataSource {のように書いている箇所があります。全部のMasterViewControllerをMasterViewに変更して、
    let CallViewManager: MasterView! = MasterView(nibName: “MasterView”, bundle: nil)
    と書き換えたのですが、コンパイルエラーが出ました。
  • 最初、nibNameが何に相当するかわかりませんでした。MasterViewController.xibをMasterView.xibに書き換える必要がありました。
  • 次の2つのoverrideが必要。
    func numberOfRowsInTableView(aTableView: NSTableView) -> Int {
        return 配列.count
    }
    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
    if ((tableView.makeViewWithIdentifier(tableColumn!.identifier, owner:self) as? NSTableCellView) != nil) {
    let wCell:NSTableCellView = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner:self) as! NSTableCellView//setする表のカラム情報をgetする。if tableColumn!.identifier == “fPopup”{
    wCell.textField?.stringValue = tableColumn!.valueForKey(tableColumn!.identifier) as! String//Popupは元の値を残す。
    return wCell} else if tableColumn!.identifier == “fFolder” {
    wCell.textField?.stringValue = wkArray[row][0]//
    return wCell
    } else if tableColumn!.identifier == “fFile”   {
    wCell.textField?.stringValue = wkArray[row][1]//
    return wCell
    } else { }
    } else { return nil }//何もsetしないとき、nilを返す。
    }
  • tableColumn!.identifierでカラム位置を把握し、値をsetする。元の値を残したい場合は、tableColumn!.valueForKey(tableColumn!.identifier) as! Stringを入れればいい。
  • 配列から転記するロジックを入れる。
  • 何もそのカラムに入れない場合は、nilを返す。

2つのwindowの制御(勉強未了)

サンプルプログラムでは、2つのwindowを制御するために次のような処理をしています。この点については勉強未了。アプリのプログラム構造をこのサンプルプログラムと同じにした方がいいかどうか不明。

xWindow.contentView!.addSubview(CallViewManager.view) 
CallViewManager.view.frame = (xWindow.contentView! as NSView).bounds

追記(3/28/2016):

Note: There are two ways that you can populate a tableview—either using the datasource and delegate protocols you’ll see in this OS X NSTableView tutorial, or via Cocoa bindings. When you start a project ensure that you choose between the two approaches. We’ll have tutorials on the site in the future that cover using Cocoa Bindings

 

Categories: Swift, 技術

Tagged as: ,