Day: April 11, 2014

obj.C:編集済みWebViewのsaveとrestore

WebViewをeditableにして編集加工したものをsaveし、再度、WebViewに表示する方法を整理しておきます。

.h
IBOutlet WebView     *xbWebView; //WebView

.m
[xbWebView setEditable:YES];//編集可能に設定

DOMDocument *dSource2 = [xbWebView mainFrameDocument];
WebArchive  *webArchive2    = [dSource2 webArchive];
NSData  *data2  = [webArchive2 data]; //data object<—archive形式
[data2 writeToFile:path atomically:YES]; //書き込み
NSURL    *url = [NSURL fileURLWithPath:path];//file pathをURLに変換
 [xbWebView.mainFrame loadRequest:[NSURLRequest requestWithURL:url]];//再表示

 

配列のread/writeの仕方

.m
NSArray  *path1 = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);//directry
NSString *path2 = [NSString stringWithFormat:@”%@/test.data”,[path1 objectAtIndex:0], nil];//file path作成
NSMutableArray *wArray = [[NSMutableArray alloc] init];//配列準備
wArray[0]=@”aaa”;//配列準備
NSData *data3=[NSKeyedArchiver archivedDataWithRootObject:wArray];
[data3 writeToFile:path2 atomically:YES];  //書き込み
wkArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path2];//読み込み

 

encodeWithCoder:、initWithCoder:メソッドを実装

cellを処理しているメソッドに追加します。keyはInterface Builderで定義します(NSTableViewを処理しているならすでに定義ずみのはずです)。
//————————————————————–//
//coder
//————————————————————–//
– (id)initWithCoder:(NSCoder *)coder
{                                              
    fButton = [coder decodeObjectForKey:@”fButton”];  
    fID         = [coder decodeObjectForKey:@”fID”];   
    fName   = [coder decodeObjectForKey:@”fName”];  
    fURL     = [coder decodeObjectForKey:@”fURL”]; 
    fFolder  = [coder decodeObjectForKey:@”fFolder”];  
    fFile       = [coder decodeObjectForKey:@”fFile”];    
    fFilePath     = [coder decodeObjectForKey:@”fFilePath”];
    fSort             = [coder decodeObjectForKey:@”fSort”];   
    fFolderPath = [coder decodeObjectForKey:@”fFolderPath”]; 
    fSortName   = [coder decodeObjectForKey:@”fSortName”];  
    return self;                                             
}    
//————————————————————–//
//encoder
//————————————————————–//
– (void)encodeWithCoder:(NSCoder *)encoder                   
{                                                           
    [encoder encodeObject:fButton   forKey:@”fButton”];   
    [encoder encodeObject:fID           forKey:@”fID”];      
    [encoder encodeObject:fName     forKey:@”fName”];      
    [encoder encodeObject:fURL       forKey:@”fURL”];      
    [encoder encodeObject:fFolder    forKey:@”fFolder”]; 
    [encoder encodeObject:fFile         forKey:@”fFile”];     
    [encoder encodeObject:fFilePath  forKey:@”fFilePath”];  
    [encoder encodeObject:fSort         forKey:@”fSort”]; 
    [encoder encodeObject:fFolderPath  forKey:@”fFolderPath”];
    [encoder encodeObject:fSortName    forKey:@”fSortName”];
}   

これで宿題はすべてクリアできました。きょうからMesaContをTextViewからWebViewベースに改造します。なお、最新版に更新したサンプルプログラムは目次のソースコードにあります。

参考:iOS でオブジェクトをシリアライズしてファイルに保存する方法

参考:オブジェクトの状態をファイルに保存・復元する。(シリアライズ・デシリアライズ)

追記:NSTableViewのsaveは上記でOKだったはずですが、再び落ちるようになったので.txtに戻して、先に進めています。

追記 8/19/2014:NSArrayをそのままsaveするには、bridgeすればいいようです。Swiftでは、配列をそのままsaveする方法に変更します。Objective-Cでのやり方は、ここに書いてあります。