Month: July 2014

Swift:NSTableViewの行(row)削除

NSTableViewは配列Dictionaryを制御すれば追加・挿入・削除等、やりたいことは一通りできることがわかりました。ソートだけはまだなのですが、Treeで制御すれば不要なので省略します。

Yosemiteがリリースされることを思い出し、昨日の朝までウダウダやっていたので、昼間起きているのがきついでした。それで、昨日はSwiftに触らずじまいで終わりました。

表の行をどのようにして削除するのか、今朝、もう一度できなかったことが何だったか思い出してみて、やはり、配列Dictionaryに値を入れて表示させるのだから、これを削除するのが妥当という考えに落ち着きました。

それで、peopleArray.removeAtIndex(0)で削除すると、みごとにOKになりました。頭の中を整理すると次のようなことになります。

  • NSTableViewの表操作(追加・挿入・削除等)は、①配列を変更する、②NSTableViewに反映する(手順は少ない)。
  • 配列はDictionaryとする。1行は各カラムのidentifierで紐付けて構成する。
  • 各カラムを([identifier,値])でsetにして1行を作り、appendもしくは+=追加する。
    +=の方がわかりやすい。
  • 特定の行の前に挿入したいときは、insertを使う。
  • 削除には、いくつか方法がある。
  • これでNSTableViewはほぼOK。

ソースコードはここにあります。

注意:削除はメッセージでもわかるようにしていますが、『削除したいとき【index or last or … or all】のいずれかをfirstnameに入力する』必要があります。

スクリーンショット 2014-07-26 21.28.00

スクリーンショット 2014-07-26 23.07.35

便利にMac:OS X 10.10 Yosemite

OS X 10.10 Yosemiteプレビュー版がリリースされたのでインストールしました。

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

  • 概ね良好。というか、昔のApple OSのupdate版と比べると上出来。
  • USB HDDを認識しなかったので、HDDの電源をOFF/ONしたらESETのファイルチェックが始まり、終わったときにUSB HDDとして表示されました。
  • VMWare Fusionは動きません。
  • Dropboxのリンクの共有(Dropbox.app?)が表示されないので、ブラウザからリンクを自分でコピーする必要があります。
  • iTunes、 メール、カレンダー等のAppleアプリ、Firefoxとアドオン、MSOfficeなどは大丈夫そうです。
  • iCloudはアップデートすると既存のものとの互換性が失われるとのことですが、検討中です。その前にiOSのバージョンを上げないといけません。
  • wordpressブログは言語が日本語だと投稿画面のUIに文字化けが発生しました。英語に変更すればOK。前にも何回か同じことが起きたので、今後は英語UIで行くことにします。

Swift:NSTableView+IBAction

windowに定義したtext fieldsに入力された値を表に入れる方法がわかりました。

注意するべき点は次のようなことでした。

  • 値を引き継ぐために変数はメソッドの中に定義しない。
  • var peopleArray:[NSDictionary] = []のように配列を初期化する。
  • rowの追加は、peopleArray.append([“identifierFirst”: xbFirstName.stringValue, “identifierLast”: xbLastName.stringValue])のようにappendを使う。
  • getDataArray で強制的に文字列を入れていた箇所は削除する。

ソースコードはここにあります。

スクリーンショット 2014-07-24 07.57.08

Swift:storyboardは? NSTableView

NSTableViewがうまく行かないので、Youtubeに寄り道していたら、OS Xでもstoryboardが使えるようになることがわかりました。これはいいニュースです。

しかし、残念なことは、OS X Yosemite 10.10をリリースまで待つか、有料のdeveloper契約をしないと、使えません。急にYosemiteが遠くになりました。

このとき、脳裏に甦ったのは、Yosemiteに行く道を途中で間違え、片側一車線のある山道、右下が大きな崖になっている山道を越えてYosemiteに行ったときの記憶です。次の年にBrianが「土、日にキャンプに行くから家族を連れて一緒にどうだ」と親切にも誘ってくれたのですが、トラウマもあり、お断りしてNapaに行きました。

それで、NSTableViewがうまく行かないのは、Yosemiteでないからか?と疑いましたが、Yosemiteを導入した場合、ほかのアプリが不安定になり、VMWarega動かなくなるリスクもあるので、さんざん考えた揚げ句、あと3ヶ月待つことにしました。

そう腹を決めたら、力づくで10.9+.xibでSwiftを動かすしかありません。気を引き締めて取り組みました。すると、Interface Builderのリンクを修正したら、サンプルプログラムが思った通りに動きました。

続きとソースコードアップはあとで。

スクリーンショット 2014-07-22 23.16.42

いくつか確認したいことがあったので、サンプルコードSwift NSTableView sample codeを書き換えました。

  • カラム1は、button cellはあとでIBActionを調査できるように追加しました。
  • カラム2、カラム3のidentifierを変更することで、値のsetの仕方を確認しました。[“identifier.first”: “abc”, “identifier.last”: “123”]のような書き方になるようです。つまり、[“identifier”:”値”,・・・,identifier”:”値”]で1行分のデータを構成する。
  • このサンプルはDictionaryです。1行ずつ書き込む方法もあると思いますので、その確認が必要です。さもなければ、この例のように表単位でまとめてセーノで書き込まなければなりません。
  • 行数の求め方、TableViewの書き込みはサンプルに含まれています。
  • 行単位の処理、挿入、追加、削除がどうなるか、調べる必要があります。

スクリーンショット 2014-07-22 23.30.47スクリーンショット 2014-07-22 23.34.13

サンプルコードはここにあります。AppDelegateだけが該当します。

 

Swift:1行目から苦戦

TableViewのObjective-CサンプルプログラムをSwiftにコンバージョンしはじめました。1行目から苦戦です。これでは泣きが入ります。

まず、.hの@interface ViewCont : NSObject    <NSTableViewDataSource, NSTextViewDelegate> をどう書くか?

class ViewCont: NSObject, NSApplicationDelegate,NSTableViewDataSource, NSTextViewDelegate

それで、すぐにinitがないと言って来たので、とりあえず追加。

@IBOutlet   var     window: NSWindow
@IBOutlet   var     xbTableView:NSTableView
    var         wkArray:[String] 
    init() {
        wkArray = []
    }

windowのタイトルの変更[_window setTitle:@”TestTable97″];の変更は?
その前に、– (void)awakeFromNibはどうするのだろ?

override func awakeFromNib() {
window.title = “TestTable97”
}

こんな具合で、この作業をしばらく続けないと、Swift使いになれそうにありません。先はとても長そう。

Swift:struct構造体

structで構造体を定義できます。クラスの外側に定義した場合と、クラスの内側に定義した場合の使い勝手を確認しました。

クラスTestSwiftの上側に書いたものを【外側】(クラス外)、クラスTestSwiftの下側に書いたものを【内側】(クラス内)としています。

import Cocoa
struct StStructure {  
    var richHouse  = 0 
    var richpeople = “John”  
}     
//————————————————————————–//
class TestSwift: NSObject, NSApplicationDelegate {
@IBOutlet var window: NSWindow
struct ValueStructure {
    var filepath:String   = “int01”       
        var urlUpdated:String = “int02”     
        let urlDefault:String = “int03”    
    }  
var vs = ValueStructure() 
var exStructure = StStructure()  

わかったことは次の通りです。

  • クラスの内・外による違いはありません。
    ➡ほかのクラスとの関係ではどうか、このあと、調べておく必要があります。
    クラス内structはほかのクラスから参照不可。クラス外は参照可。
  • structの利用宣言var vs = ValueStructure()  をクラスの初期化の箇所に書いておけば、このクラスのメソッドの中でこれをシェアできるので便利です。
  • 構造体は、vs.filepath、exStructure.richHouseのように修飾して利用します。
  • var変数は変更可能で、変更した値はメソッド間で値が引き継がれます。
  • vs = ValueStructure(filepath:”x”, urlUpdated:”y”, urlDefault:”z”)のような書き方をするとき、省略ができませんでした。この使い方は今ひとつ意味不明です。

スクリーンショット 2014-07-20 15.18.54

Swift:Dictionary

Dictionaryはクラスでなく構造体だそうです。サンプルプログラムを一通り実行してみたのですが、問題はありませんでした。

どこで使うか思いつかないので、とりあえず流してみた感じです。

スクリーンショット 2014-07-19 21.04.08

24-2 Dictionary hachinobu 28 man
24-3 Dictionary 3
24-4 Dictionary keysArray=[yama, kawa, sora]
24-5 Dictionary valuesArray=[hachinobu, 28, man]
24.6 Dictionary  [yama: Mt. Fuji, kawa: 28, sora: man]
24.7 Dictionary  [yama: 富士山, kawa: 28, sora: man]
24.8 update
24.9 Dictionary valueを追加 [kawa: 29, sora: man, yama: 富士山, height: 171]
24.10 Dictionary 指定したkeyのデータを削除 [kawa: 29, sora: man, yama: 富士山]
24.11 Dictionary nilは削除扱い [kawa: 29, sora: man]
24.12 Dictionary nil optional扱い [key2: B]