Month of 8月, 2011

たくさんのチェックボックスを一度にON/OFFする方法

in

makePasswordの中で31個のチェックボックスを使うのですが、例えばすべてのチェックボックスをONにしたりOFFにしたりするにはCocoaではどうやるのか悩みました。オーソドックスにはOutletで接続して

[myCheckBox setState:YES]

とかするのだろうけど、31個のOutletはさすがに面倒。似たような場合MFCなら、コントロールのIDを連続的に定義しておいて

int firstControl = IDC_XXXXX;
for(int controll = IDC_FIRST_XXX; controll < IDC_LAST_XXX; ++controll)
{
  CButton* myButton = (CButton*)GetDlgItem(controll);
  myButton->SetCheck(1);
}

みたいなカンジでいちいちコントロール変数を定義しておかなくとも一気にセットできるのに。

結局、巧いテが見つからず今回はNSButtonのサブクラスを作成しコントロールクラスからtag値の配列をブロードキャスト

[[NSNotificationCenter defaultCenter] 
  postNotificationName:@"ChangeSpecialCharacterNotify" object:arrayContolsTag]; 

各コントロールクラスでは通知に自分のtag値が含まれていたらON、含まれていなければOFFにする

- (void)awakeFromNib
{
  NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
  [nc addObserver:self selector:@selector(handleSetState:) 
  name:@"SpecialCharacterNotify" object:nil];
}

-(void)handleSetState:(NSNotification*)aNotification
{
  NSArray* characters = [aNotification object];
  if (characters != nil && 
  [characters containsObject:[NSNumber numberWithInteger:[self tag]]])
  {
    [self setState:YES];
  }
  else
  {
    [self setState:NO];
  }
}

っていう実装にしたんですが、もっと巧いやり方はないものか...なんかモヤモヤがとれません。ダイレクトに送る方法はないのかな?

mkpasswd作りました

in

ランダムなパスワードを生成するツールが欲しくて作りました。時間がなかったのでLinux等に付属のmkpasswdを流用しようと思ったのですが、ソースをみているうちに単なるrandom()を少しアレンジしただけのものでもいいかという気になったので、一気に作成しました。本当は、ANSI X9.17で乱数生成するつもりだったんですけど面倒なのでヤメました。

ソースはGitHub::makePasswordにあります。