ココTip 01から10

快技庵 > 開発情報 > ココTip 01から10

ココTip

Cocoaの何気ない利用例を『ココTip』としてまとめました。

「ココ」とはCocoaのことです、WWDCなどで「Cocoa」に対するApple技術者の発音はほとんど「ココ」としか聞こえないのでこんなタイトルとしました。
Cocoaは多機能なフレームワークです。必要な機能が膨大な資料のどこにあるのか見つけられないことがありました。ココTipがそんな時にお役に立てばと思います。

ココTipはもともとMOSAの「Cocoa実用セミナー」のサンプルソース内にコメントとして書いていた説明に番号を付けた物です。
番号は単なる識別子です。

ここではソースの一部しか示せないのでわかりにくい部分もあるかもしれません。随時加筆していくつもりです。

★2008年1月4日 11から20を追加しました。
LinkIconココTip 11から20

【01】ラジオボタンのアクション

nibファイルの各ラジオボタンには0から始まる連番のtag番号を付けtag番号で区別します。
こうするとアクションは簡単になりアウトレットの接続も1回で済みます。

- (IBAction)selectRadioBtn:(id)sender
{
    // 選択セルのtag番号をm_modeにセットする
    m_mode = [[sender selectedCell] tag];
    // 再表示など
    // 例:tableViewを再表示する
    [r_tableView reloadData];
}

【02】nibの設定状態を実行に反映する

ラジオボタンのnibの状態を得て対応する変数にセットする例

IBOutlet NSMatrix*_selectRadioBtn;///< 切替ラジオボタン
intm_mode;///< データソースのモード

の場合の例です。

-- (void)awakeFromNib
{
    // nibの状態をモードに反映する
    if (r_selectRadioBtn) {
        // ココTip【2】nibの状態をm_modeに反映する【1】参照
        m_mode = [[r_selectRadioBtn selectedCell] tag];
    }
}

独自の環境設定に状態を保存している場合この処理は必要ありません。
ちょっとしたテストプログラムなどの初期値をnibで変更したい場合に使えます。

【03】カラムの幅不足時の省略表示

NSTableViewでカラムの幅に比べて表示する文字が多い場合どのように省略するかは表示する文字列を NSAttributedStringにし NSParagraphStyleAttributeName 属性で指定できます。

NSLineBreakByTruncatingHead 先頭を...で省略
NSLineBreakByTruncatingTail 末尾を...で省略
NSLineBreakByTruncatingMiddle 真ん中を...で省略

具体的にはデータソースでNSStringではなく NSAttributedStringを返します。

なおこの設定を行なわない場合のデフォルトはMac OS Xのバージョンでことなります。
10.3.9では単純にクリップされます。
10.4では NSLineBreakByTruncatingTail の動作です。

NSDictionary *m_nameInfo; ///< name 表示フォントアトリビュート
の場合の例です。

// 属性はあらかじめ用意する
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[style setLineBreakMode:NSLineBreakByTruncatingTail];
m_nameInfo = [[NSDictionary alloc] initWithObjectsAndKeys:style, NSParagraphStyleAttributeName, nil];
[style release];


// データソースで NSAttributedStringを作りそれを返す
[[NSAttributedString alloc] initWithString:[m_nameData objectAtIndex:rowIndex] attributes:m_nameInfo];

注意
完全に表示できない場合は、たとえばツールチップですべて確認できるようにするなど省略していない状態をユーザーに伝える手段を用意するべきです。

【04】チェックボックスに対応する

チェックボックスのチェックの状態は state メソッドで得られます。
チェックボックスのアクションを用意すれば sender に対してstateメッセージを送ることで状態を確認できます。

なおチェック状態はクリックで変更されてからアクションが呼ばれます。(アクションの中でチェック状態を変更する必要はありません)

- (IBAction)checkAction:(id)sender
{
    BOOL checkState = [sender state];
    // checkState を使って再表示などをおこなう
}

【05】OSバージョンにより利用可能なメソッドを調べる

10.4からNSTableViewの行の高さがすべて同じである制限はなくなりました。
簡単な設定ですべて同じでない表示が実現できます。それを設定するメソッドは
-(void)noteHeightOfRowsWithIndexesChanged:(NSIndexSet *)indexSet
です。
ただしこのメソッドは実行するOSバージョンにより使えない場合があります。

このような場合は respondsToSelector: を使って利用可能か実行時に確認します。

IBOutlet NSTableView *r_tableView; ///< テーブルビュー
IBOutlet NSButton *r_checkBox; ///< 高さ切替チェックボックス
BOOL m_VariableRowHeights;///< 高さ可変フラグ

// noteHeightOfRowsWithIndexesChanged: は10.4から利用可能なメソッド
// ココTip【5】利用可能か確認する
if ([r_tableView respondsToSelector:@selector(noteHeightOfRowsWithIndexesChanged:)]) {
    // 行高さ可変で再表示
    NSRangeallRange = NSMakeRange(0, [m_nameData count]);
    [r_tableView noteHeightOfRowsWithIndexesChanged:
                                     [NSIndexSet indexSetWithIndexesInRange:allRange]];
}
else {
    // 使えなければ高さ可変は不能
    // 高さは固定にする
     m_VariableRowHeights = NSOffState;
    [r_checkBox setState:m_VariableRowHeights];
    [r_checkBox setEnabled:NO];
}

【06】NSNumberの値を文字にする

文字(NSString)に変換するには description を使えます。
- (NSString *)description
はNSObjectのメソッドなので基本的にすべてのクラスで通用します。

ファイルサイズを表示する
ここではファイルサイズを文字列で表示する例です。
ファイルサイズは NSFileManager の fileAttributesAtPath:traverseLink: で得る属性(NSDictionary)から得ることができます。

// パスを指定してファイルサイズの文字列を得るには
NSDictionary *attr;
attr = [[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:NO];

// ファイルサイズは[attr objectForKey:NSFileSize](これはNSNumber)
// 文字列は[[attr objectForKey:NSFileSize] description]

【07】NSDateを文字列にする

NSDateを日付の文字列として表示する場合にもdescriptionが使えます。
最もシンプルな方法です。

ファイル修正日を表示する
ここではファイル修正日を表示する例です。
ファイル修正日も NSFileManager の fileAttributesAtPath:traverseLink: で得る属性(NSDictionary)から得ることができます。

// パスを指定してファイル修正日の文字列を得るには
NSDictionary *attr;
attr = [[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:NO];

// 修正日は[attr objectForKey:NSFileModificationDate](これはNSDate)
// 文字列は[[attr objectForKey:NSFileModificationDate] description]

書式を指定する表示はこちら
LinkIconココTip【14】NSDateを書式指定して表示する

【08】メニューにチェックマークを付ける消す

メニューにチェックを付けるにはNSMenuItemのオブジェクトに setState: NSOnState メッセージを送ります。
チェックを消すには setState:NSOffState メッセージを送ります。
パラメータはBOOLではないことが注意点です。

例:
IBOutlet NSMenuItem *r_sortDate; ///< Sortメニュー日付順項目

// チェックマークを外す場合
[r_sortDate setState:NSOffState];

【09】Outletだけを接続しnibファイルではアクション接続を省略する

アクションの接続は Interface Builderを使って行ないnibに保存しておくこともできますが、Outletだけ接続し実行時にアクションを決める事ができます。

例:
nibではメニュー項目のアウトレットだけ接続しておく
IBOutlet NSMenuItem *r_sortDate; ///< Sortメニュー日付順項目

// r_sortDateにアクションを設定する
[r_sortDate setAction:@selector(sortMenu:)];
[r_sortDate setTarget:self];

【10】メニューアイテムの色を指定する

メニューアイテムの色は実行時に変わらない場合はnibで指定できます。

メニューの文字をダブルクリックで選択しフォントパネルの Text Colorボタンでカラーパネルから指定します。

実行時に変更する場合
実行時に色を変更する場合は
- (void)setAttributedTitle:(NSAttributedString *)string
メソッドを使い色を指定した文字列をセットします。

文字列に色を指定する場合の注意
背景色との組み合わせで見にくい色があります。判読しにくい組み合わせにならないよう十分注意が必要です。
たとえば背景が白の場合文字に黄色などを設定しないよう注意が必要です。
どのような色でも設定可能な場合は文字に色をつけるのではなくメニューアイテムにアイコンを表示するような別の手段を用意しましょう。

2013年ニュース

2012年ニュース

2011年ニュース

2010年ニュース

2009年ニュース

2008年ニュース

2007年ニュース

2006年ニュース

2005年ニュース

2004年ニュース

2003年ニュース

2002年ニュース