*

確認ダイアログ付きチェックボックス(Checkbox)

公開日: : 最終更新日:2014/07/10 iOS ,

Checkbox
図のようなチェックボックスとアラートの組合せを実装しようとした際にiOSには外観などを簡単にカスタマイズできる標準のチェックボックがないことを知りました。チェックボックスと同様の機能をもつUISwitchはありますが、外観のカスタマイズが困難で色の変更程度しかできません。
一方でUIButtonは外観を自由に変えることができるので、UIButtonの動作をカスタマイズしてチェックボックスにしました。

チェックボックス(Checkbox)の実装

@implementation MHCheckbox

- (void)setUserInteractionEnabled:(BOOL)userInteractionEnabled {
    [super setUserInteractionEnabled:userInteractionEnabled];
    if (userInteractionEnabled) {
        [self addTarget:self action:@selector(checkboxTapped:) forControlEvents:UIControlEventTouchUpInside];
    } else {
        [self removeTarget:self action:@selector(checkboxTapped:) forControlEvents:UIControlEventTouchUpInside];
    }
}

- (void)setChecked:(BOOL)checked {
    self.selected = checked;
}

- (BOOL)isChecked {
    return self.selected;
}

- (void)toggleChecked {
    self.selected = !self.selected;
}

- (void)setImage:(UIImage *)normal checked:(UIImage *)checked disabled:(UIImage *)disabled {
    [self setBackgroundImage:normal forState:UIControlStateNormal];
    [self setBackgroundImage:normal forState:UIControlStateHighlighted];
    [self setBackgroundImage:checked forState:UIControlStateSelected];
    [self setBackgroundImage:disabled forState:UIControlStateDisabled];
}

#pragma mark - private method
- (void)checkboxTapped:(MHCheckbox *)button {
    if ([_delegate respondsToSelector:@selector(checkboxShouldChange:checked:)]) {
        if (![_delegate checkboxShouldChange:self checked:!button.selected]) {
            return;
        }
    }
    button.selected = !button.selected;
    [button sendActionsForControlEvents:UIControlEventValueChanged];
}

@end


ポイント

  • UIControlStateHighlightedにNormalの画像を設定
  • タップされた時にselectedプロパティを反転させ、sendActionsForControlEventsを呼びだす

    プログラム的に値を変更した場合は、ValueChangedが発生しないので意図的に呼びだす必要があります。

    サンプル

    Could not inspect the application package.(おまけ)

    Could not inspect
    実装しているときに図のようなエラーがでて困りました。
    ネットで調べているとこちらの記事を見つけました。

    この記事の方法でも解消されず、私の場合、どうやら図のようにプロジェクトに[Create folder references for any added folders]で[Resources]フォルダを追加したことがきっかけでした。追加したフォルダを削除して、Organizerからアプリの[Derived Data]を削除すると出なくなりました。

  • Sponsored Link

    関連記事

    internet_share.png

    インターネット共有のステータスバーを表示させない

    私の作っているアプリではcocos2d-xでCCEAGLViewを表示させるUIViewCo

    記事を読む

    products-ico5.png

    cocos2d-x v2.2からv3.3への移行

    最近、イーモンの更新でiTunesにバイナリをアップロードしたら、 2015年2月から64

    記事を読む

    icloud.jpeg

    iCloudその1:NSMetadataQueryDidUpdateNotification

    iCloudのファイル管理についてよくわかってないので、以下の点について実際に確認しながらまとめてい

    記事を読む

    IMG_2206.JPG

    【イーモン】プロモーションムービー

    デザフェスで使ったプロモーションムービーです! 当日は、AppleTVをつかってiP

    記事を読む

    teach_s.png

    [eMon] English Monstersレビュー申請中

    先日、新しいiOSアプリを審査に出しました。 English Monsters(略してeM

    記事を読む

    no image

    UIAlertのTextFieldでキーボードが表示されない(iOS7)

    TextField付きのUIAlertViewでたまにキーボードが表示されないことがあり、 ながら

    記事を読む

    5017d1a195d95dfed9f60e9fd5d82c13.png

    苦手な英語の発音を真面目に考えてみた

    最近、英語の発音に真面目に取り組んでます。 これまで読み書きが中心で、リスニングやスピーキン

    記事を読む

    ace.png

    イーモンxエースクラウン「Aの塔」決定

    あの英和辞典エースクラウンがイーモンに登場します! エースクラウンで取り上げられている会

    記事を読む

    badge.png

    iOSでバックグラウンドタスク(BackgroundTask)

    iOSでは何もしなければアプリケーションがバックグラウンドに移行するとすぐにRunLoopやワ

    記事を読む

    emon_banner_small.png

    eMon

    eMonのプレイ動画をアップロードしました。 なぞって、つなげて回答するシステムが

    記事を読む

    Sponsored Link

    Message

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    Sponsored Link

    • 発音辞書イーモン
    • English Monsters
    • sLog(時間管理アプリ)
    • 生粋のC++プログラマーです。 最近は、Objective-Cやxcode、cocos2d-xなどを学びながらiPhoneアプリを開発しています。

    Google+ Google
    PAGE TOP ↑