itok's Lab

昔の開発ネタを記録として残してます

2007-01-01から1年間の記事一覧

TableのcellにToolTipを指定する

table や outline の上にマウスカーソルを持っていったときに表示される ToolTip を指定します。これ、10.3以前では非常にややこしいことになっていたんですが、10.4になってようやくそれ用の delegate メソッドが登場しました。 // NSTableView -(NSString*…

faulting とその解除

一つのオブジェクトを参照するために、それに関連するすべてのオブジェクトツリーを永続層から読み込んで構築するのは無駄が多い。そのため、Core Data では実際に参照された時だけ関連オブジェクトをメモリ上に配置する仕組みを取り入れている。これが faul…

NSArray にフィルタリング

CoreData に伴って導入された Predicate というクエリー言語。なにもデータベースにアクセスする時だけ使うのではなくて、NSArray から条件にあったものだけを抽出したりするのにも使えます。 // NSArray -(NSArray*) filteredArrayUsingPredicate:(NSPredic…

OutlineViewの幅を自動調整させない

OutlineView 上で item を開いたり閉じたりしていると、勝手に column の幅が調整されて広くなったり狭くなったりします。これがデフォルトの挙動なんだけれど、これをとめてもらいましょう。 // -(void) setAutoresizesOutlineColumn:(BOOL)resize [outline…

NSURLDownloadでダウンロード-1

ダウンロードクラス NSURLDownload を使ってみましょう。非同期に DL することを目的とした DL クラスとなります。非同期なんでその経過を知るために delegate を用いてメッセージのやり取りをするわけです。 では、まずオブジェクトの生成と DL の開始。 1:…

NSStringとSEL型の相互変換

以前同じような題名でC文字列とSEL型の相互変換について書いてましたけれど、よくよく見てみると、普通にNSStringからも変換できる関数マクロがあるみたいですね。今更知った自分にショック。 SEL NSSelectorFromString(NSString* aSelectorName); NSString*…

領域ごとにマウスカーソルを設定する

ある view 内のある領域だけ、特別なカーソルを設定する場合。例えば独自に resize の仕組みを実装していて、view の端に来た時にマウスカーソルを resize 用のカーソルに変えるとか。これ、マウスの動きを監視する必要があるのかと思ったら、それ専用のメソ…

接続中の iPod を確認する

書きだして思ったけれど、手元にある iPod は 3G と初代 Shuffle、、、全然情報が古いかもしれない・・・(まあ、いいか、メモだし) iPodシリーズには大きくわけて2種類あります。shuffleとそれ以外。違いはといえば、表面上ではiTunesからPodcastを自動登…

WebViewのコンテンツソースをとりだす

WebView に表示中のコンテンツのソースをとりだします。WebFrame に表示中のコンテンツオブジェクトをとりだすメソッドがあって、 // WebFrame -(WebDataSource*) dataSource; んで、この WebDataSource から NSData を取り出せばOK。 // WebDataSource -(NS…

返事のある notification

「通知(notification)」という仕組みはデザインパターンとしても有名でかつ非常に基本的。お互いに相手を知らないオブジェクト間のメッセージとして、非常に重宝しています。最近の言語、というかその言語が動く基本フレームワークにはたいがい仕組みとし…

ログイン項目への追加

OSX

「ログイン時に起動」するためにはその設定をあるファイルに書き込んでおく必要があります。そのファイルというのが ~/Library/Preferences/loginwindow.plist。開いてもらうとわかりますが、AutoLaunchedApplicationDictionary というキーの元に各起動アプ…

ドキュメントwindowをずらさないで表示

Document-Based アプリケーションを作っていると、新しく Window を開くたびに自動的に Window の位置がずらされて表示されますよね。ずらすかどうかは NSWindowController の↓のメソッドで制御できます。 -(void) setShouldCascadeWindows:(BOOL)flag; もち…

NSViewの座標系を回転

描画領域である NSView の座標系を丸ごと回転させる方法。メソッドとしては2種類あります。 -(void) setBoundsRotation:(float)angle; // angle は反時計回りの度数指定 -(void) setFrameRotation:(float)angle; もちろんのことながら、回転することによって…

動的なbinding

プログラム上で Cocoa binding を行うには bind:toObject:withKeyPath:options: を使います。こんな感じで。 // binding のオプション // (NSValueTransformer の指定とか、初期値の指定とかいろいろ) NSDictionary* options = [NSDictionary dictionaryWith…

CocoaでいわゆるURI encode

Cocoaといいつつ、実はCoreFoundationにしかメソッドがなかったりしますけれど、いわゆるところのURI encode/decode(%エスケープ)を行う方法。encode はこう。 // 通常文字列 → %エスケープ (encode) CFStringRef CFURLCreateStringByAddingPercentEscapes…

キーイベントを生成する

例えばリターンキーイベントを Window に送る場合はこんな感じ。 NSEvent* event = [NSEvent keyEventWithType:NSKeyDown // キーイベントの種類(1) location:NSZeroPoint // イベントの起きた場所(2) modifierFlags:0 // モディファイアキーフラグ(3) times…

「Finderで開く」を実現する

ダウンロードした時なんかによくある「Finderで開く」の実現。Finder.app を指定してファイルを開いたりするのかと思ったらちゃんとメソッドありました。 [[NSWorkspace sharedWorkspace] selectFile:path inFileViewerRootedAtPath:nil];

直近に起きたイベントを取得

直近で起きたイベントを知りたい場合、これは簡単これでOK。 NSEvent* event = [NApp currentEvent]; ちなみに NSWindow にも同名のメソッドがあるけれど、中身は同じ(NSApplication のメソッドを呼び出している)らしいです。

アプリ更新フレームワーク:Sparkle

アプリ更新をRSSに埋め込むというAppcastingに対応したCocoaのフレームワークにSparkleというものがあります。これを使っている有名なアプリ群というと、、、CyberduckとかAdiumとかiTermとか日ごろお世話になっているものばかり。MITライセンスですし早速試…

NSMatrixの動的生成

NSCell を行列表示してくれる NSMatrix を動的生成(要するにコードでプログラム)してみましょう。 まず、行列を生成する前に、matrix に含まれる NSCell がどの種類の cell かを指定しておきましょう。(既存の cell を登録するなら InterfaceBuilder でも…

NSTableViewの自動選択を解除する

NSArrayController をもちいて NSTableView の表示を行っている場合、データの一覧を表示させた時に、自動的に1番最初の行が選択された形になってしまいます。これをなんとかやめてもらえないか( NSTable の deselectAll: を呼んでもダメなのね)と思ったら…

段落スタイルの設定

文字列を描画したりする場合、NSRect を指定しての描画で「中央揃え」とかはみ出した文字を「...」で省略させたりとか、そういうことの設定には NSMutableParagraphStyle を使います。 まず、揃えに関してはこんな感じ。 -(void)setAlignment:(NSTextAlignme…

NSControlで -mouseDragged: をつかまえる

NSButton など NSControl のサブクラス(のサブクラス)を実装して、そこでマウスのドラッグを受け付けたい場合、 NSControl はもちろん NSResponder のサブクラスですから -(void)mouseDragged:(NSEvent*)event を上書きしてあげればよさそうです。が、うま…