カテゴリー ‘ スマートフォン

[iPhoneアプリ]TabBarControllerで選択中のTabをプログラムで切り替える方法


 

iPhoneアプリの「TabBarController」でプログラムで選択中のタブを切り替える方法

// Indexは0から始まる
self.tabBarController.selectedIndex = 0;

これで、選択中のタブを切り替える事が出来る、単純!

iPhoneで日付を入力するモーダルウインドウの作り方


 

iPhoneでの日付の入力方法は、ドラムロールのようなこちら

「UIDatePicker」で行うのが普通だと思います。

これが入力ように画面を覆うように表示されていたらすごく邪魔ですよね?

なので、こいつを文字列入力のキーボードのように下からニョキっと出るように改造してみたいと思います。

動作イメージ

1.nibファイルの作成

まず完成図はこちら、

UIを設置する

  1. Viewを配置「幅:320 × 高さ:480」で設置する
  2. UIDatePickerを最下部に設置する
  3. UIToolBarをUIDatePickerの上に設置する
  4. UIBarButtonItemを2つUIToolBarに設置する
  5. ボタンの間に「Flexible Space Bar Button Item」を設置する

UIの設定を変更する

  1. File’s Ownerの設定
    1. 「Custom Class」に「ModalDatePicker」と入力する(この後に作るViewControllerの名前を設定)
  2. Viewの設定
    1. 「Background」をDefaultの色なしに設定する
    2. 「Width」を320 「Height」を480で設定する
    3. 「File’s Owner」とReferencing Outletsで接続する
  3. DatePickerの設定
    1. 「File’s Owner」とReferencing Outletsで接続する(この後に作成するViewControllerのhファイルに設定が必要)
  4. 左ボタンの設定
    1. 「File’s Owner」とSent Actionsで接続する(この後に作成するViewControllerのhファイルに設定が必要)
  5. 右ボタンの設定
    1. 「File’s Owner」とSent Actionsで接続する(この後に作成するViewControllerのhファイルに設定が必要)

2.ViewControllerの作成

  1. 「ModalViewContoller.h」の編集
    #import <UIKit/UIKit.h>
    
    @class ModalDatePicker;
    
    @protocol ModalDatePickerDelegate
    
    - (void) didDatePickerOKClicked:(ModalDatePicker *) controller selectedDate:(NSDate *) selectedDate pickerName:(NSString *) pickerName pickerTag:(NSInteger) pickerTag;
    - (void) didDatePickerCancelClicked:(ModalDatePicker *) controller pickerName:(NSString *) pickerName pickerTag:(NSInteger) pickerTag;
    
    @end
    
    @interface ModalDatePicker : UIViewController
    
    @property (weak, nonatomic) IBOutlet UIDatePicker *picker;
    @property (nonatomic, assign) id<ModalDatePickerDelegate> delegate;
    @property (nonatomic, retain) NSString *pickerName;
    @property (nonatomic, assign) NSInteger pickerTag;
    @property (nonatomic, retain) NSDate *dispDate;
    
    - (IBAction)okClicked:(id)sender;
    - (IBAction)cancelClicked:(id)sender;
    
    @end
  2. 「ModalViewController.m」の編集
    #import "ModalDatePicker.h"
    
    @interface ModalDatePicker ()
    
    @end
    
    @implementation ModalDatePicker
    @synthesize picker = _picker, delegate = _delegate, pickerName = _pickerName, dispDate = _dispDate, pickerTag = _pickerTag;
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	// Do any additional setup after loading the view.
    }
    
    - (void)viewDidAppear:(BOOL)animated {
        if (self.dispDate != nil) {
            [self.picker setDate:self.dispDate];
        }
    }
    
    - (void)viewDidUnload
    {
        [self setPicker: nil];
        [super viewDidUnload];
        // Release any retained subviews of the main view.
    }
    
    - (IBAction)okClicked:(id)sender {
        [self.delegate didDatePickerOKClicked:self selectedDate:self.picker.date pickerName:self.pickerName pickerTag:self.pickerTag];
    }
    
    - (IBAction)cancelClicked:(id)sender {
        [self.delegate didDatePickerCancelClicked:self pickerName:self.pickerName pickerTag:self.pickerTag];
    }
    
    @end

これで「ModalDatePicker」は作成完了です。

使用方法

  1. ボタンを押下したら、「ModalDatePicker」を表示する
    - (IBAction)showBtnClicked:(id)sender
    {
    	// self.pickarは、ModalDatePicker型のインスタンス変数です。
    	self.picker = [[ModalDatePicker alloc] init];
    	self.datePicker.pickerName = @"どこから呼ばれたか特定する為に設定";
    	self.datePicker.dispDate = (self.dispDate != nil) ? self.dispDate : [NSDate date];
    	self.datePicker.delegate = self;
    	[self showModel:self.datePicker.view];
    }
    
    - (void) showModel:(UIView *) modalView
    {
    	UIWindow *mainWindow = (((AppDelegate *) [UIApplication sharedApplication].delegate).window);
    	CGPoint middleCenter = modalView.center;
    	CGSize offSize = [UIScreen mainScreen].bounds.size;
    	CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);
    	modalView.center = offScreenCenter;
    	[mainWindow addSubview:modalView];
    	[UIView beginAnimations:nil context:nil];
    	[UIView setAnimationDuration:0.5];
    	modalView.center = middleCenter;
    	[UIView commitAnimations];
    }
  2. 「ModalDataPicker」のdelegateを実装する
    - (void) didDatePickerOKClicked:(ModalDatePicker *)controller selectedDate:(NSDate *)selectedDate pickerName:(NSString *)pickerName pickerTag:(NSInteger) pickerTag
    {
    	[self hideModal:controller.view];
    	controller.delegate = nil;
    	NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    	[formatter setDateFormat:@"yyyy年MM月dd日"];
    	if ([pickerName isEqualToString:@"どこから呼ばれたか特定する為に設定") {
    		self.date = selectedDate;
    		self.label.text = [formatter stringFromDate:self.date];
    	}
    }
    
    - (void) didDatePickerCancelClicked:(ModalDatePicker *)controller pickerName:(NSString *)pickerName pickerTag:(NSInteger) pickerTag
    {
    	[self hideModal:controller.view];
    	controller.delegate = nil;
    }
    
    - (void) hideModal:(UIView*) modalView
    {
    	CGSize offSize = [UIScreen mainScreen].bounds.size;
    	CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);
    	[UIView beginAnimations:nil context:(__bridge_retained void *)modalView];
    	[UIView setAnimationDuration:0.3];
    	[UIView setAnimationDelegate:self];
    	[UIView setAnimationDidStopSelector:@selector(hideModalEnded:finished:context:)];
    	modalView.center = offScreenCenter;
    	[UIView commitAnimations];
    }
    
    - (void) hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
    {
        UIView *modalView = (__bridge_transfer UIView *)context;
        [modalView removeFromSuperview];
    }

これで「ModalDatePicker」の呼び出しと、delegateの実装ができました。

1つのViewContllerで複数の「ModalDatePicker」を呼び出す必要がある場合は、

  • pickerName
  • pickerTag

を使用してどのボタンから呼び出されたかを判断することができます。

これを、応用することで様々な入力方法をモーダルウインドウ化出来るようになります。

iPhoneアプリのUIButtonでチェックボックスを実装する方法


 

iPhoneアプリのデフォルトのUIではAndroidやHTMLで実現出来るチェックボックスのようなものがありません。

ですので、UIButtonを使用してチェックボックスを作って実現してみました。

用意するもの

  1. チェックボックス用の画像
  2. UIButtonを継承したサブクラスの実装

この2つで実装できます。

まず、画像はAndroidで表示されるチェックボックスの画像を切りだして作成しました。

  

この3つの画像を使用します。

1.UIButtonのサブクラスを作成する

  1. メニューの「File」 →「New」→「File」をクリックして「Choose a template for your new file」を表示します。

  2. 「Next」ボタンを押下して、Class名に「CheckboxButton」Subclass of に「UIButton」を入力して「Next」ボタンを押下する
  3. 「CheckboxButton.h」を編集
    #import <UIKit/UIKit.h>
    
    @interface CheckboxButton : UIButton
    
    @property (nonatomic, assign) BOOL checkBoxSelected;
    
    @end
  4. 「CheckboxButton.m」を編集する
    #import "CheckboxButton.h"
    
    @implementation CheckboxButton
    
    @synthesize checkBoxSelected = _checkBoxSelected;
    
    - (void)awakeFromNib
    {
        [super awakeFromNib];
        UIImage* nocheck = [UIImage imageNamed:@"nocheck.png"];
        UIImage* checked = [UIImage imageNamed:@"check.png"];
        UIImage* disable = [UIImage imageNamed:@"disable_check.png"];
        [self setBackgroundImage:nocheck forState:UIControlStateNormal];
        [self setBackgroundImage:checked forState:UIControlStateSelected];
        [self setBackgroundImage:checked forState:UIControlStateHighlighted];
        [self setBackgroundImage:disable forState:UIControlStateDisabled];
        [self addTarget:self action:@selector(checkboxPush:) forControlEvents:UIControlEventTouchUpInside];
        [self setState:self];
    }
    
    - (id)initWithFrame:(CGRect)frame
    {
        NSLog(@"initWithFrame");
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
            UIImage* nocheck = [UIImage imageNamed:@"nocheck.png"];
            UIImage* checked = [UIImage imageNamed:@"check.png"];
            UIImage* disable = [UIImage imageNamed:@"disable_check.png"];
            [self setBackgroundImage:nocheck forState:UIControlStateNormal];
            [self setBackgroundImage:checked forState:UIControlStateSelected];
            [self setBackgroundImage:checked forState:UIControlStateHighlighted];
            [self setBackgroundImage:disable forState:UIControlStateDisabled];
            [self addTarget:self action:@selector(checkboxPush:) forControlEvents:UIControlEventTouchUpInside];
            [self setState:self];
        }
        return self;
    }
    
    - (void)checkboxPush:(CheckboxButton*) button {
        button.checkBoxSelected = !button.checkBoxSelected;
        [button setState:button];
    }
    
    - (void)setState:(CheckboxButton*) button
    {
        if (button.checkBoxSelected) {
            [button setSelected:YES];
        } else {
            [button setSelected:NO];
        }
    }
    
    @end

これで、「CheckboxButton」クラスの作成は終了です。

次は、作成した「CheckboxButton」を使用する方法です。

2.「CheckboxButton」の使用方法

  1. Storyboardまたは、nibファイルに「Round Rect Button」を設置する。
  2. 設置したButtonのClass名に「CheckboxButton」を設定する

これだけでチェックボックスが実装できます。

実際に動かしたイメージが以下になります。

チェックボックスOFF時の状態

チェックボックスON時の状態

こんな感じでチェックボックスが実装できます。

「checkBoxSelected」の状態を取得することでチェックがON/OFFなのか判断できます。

iPhoneアプリで画面表示後に、別のViewControllerを呼び出す方法


 

iPhoneアプリで画面起動後に、別のViewContollerを表示させたい場合の備忘録

結論:viewDidAppearで処理を行う。

「viewWillAppear」、「viewDidLoad」で処理を行った場合、別のViewControllerが表示されませんでした。

「viewDidAppear」ここで処理を記述した場合にのみ、ちゃんと画面が表示されました。

AndroidのzxingでNoClassDefFoundErrorが出た場合の対処


 

AndrodでzxingでQRコード読み取り機能を実装して起動した時にNoClassDefFoundErrorが表示された場合の対処方法

    1. プロジェクトのプロパティを開く
    2. Javaのビルドパスを選択
    3. 順序及びエクスポートタブを開く
    4. core.jar(zxingのjar)にチェックを付ける

これで、クリーン→実行をすると見事動作しました。

 

jarファイルがエクスポートされていないことが原因だったようです。

 

参考にしたサイト

return top