[iPhoneアプリ]TabBarControllerで選択中のTabをプログラムで切り替える方法
iPhoneアプリの「TabBarController」でプログラムで選択中のタブを切り替える方法
// Indexは0から始まる self.tabBarController.selectedIndex = 0;
これで、選択中のタブを切り替える事が出来る、単純!
iPhoneアプリの「TabBarController」でプログラムで選択中のタブを切り替える方法
// Indexは0から始まる self.tabBarController.selectedIndex = 0;
これで、選択中のタブを切り替える事が出来る、単純!
iPhoneでの日付の入力方法は、ドラムロールのようなこちら
「UIDatePicker」で行うのが普通だと思います。
これが入力ように画面を覆うように表示されていたらすごく邪魔ですよね?
なので、こいつを文字列入力のキーボードのように下からニョキっと出るように改造してみたいと思います。
まず完成図はこちら、
#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
#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」は作成完了です。
- (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]; }
- (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」を呼び出す必要がある場合は、
を使用してどのボタンから呼び出されたかを判断することができます。
これを、応用することで様々な入力方法をモーダルウインドウ化出来るようになります。
iPhoneアプリのデフォルトのUIではAndroidやHTMLで実現出来るチェックボックスのようなものがありません。
ですので、UIButtonを使用してチェックボックスを作って実現してみました。
この2つで実装できます。
まず、画像はAndroidで表示されるチェックボックスの画像を切りだして作成しました。
この3つの画像を使用します。
1.UIButtonのサブクラスを作成する
#import <UIKit/UIKit.h> @interface CheckboxButton : UIButton @property (nonatomic, assign) BOOL checkBoxSelected; @end
#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」を使用する方法です。
これだけでチェックボックスが実装できます。
実際に動かしたイメージが以下になります。
こんな感じでチェックボックスが実装できます。
「checkBoxSelected」の状態を取得することでチェックがON/OFFなのか判断できます。
iPhoneアプリで画面起動後に、別のViewContollerを表示させたい場合の備忘録
「viewWillAppear」、「viewDidLoad」で処理を行った場合、別のViewControllerが表示されませんでした。
「viewDidAppear」ここで処理を記述した場合にのみ、ちゃんと画面が表示されました。
AndrodでzxingでQRコード読み取り機能を実装して起動した時にNoClassDefFoundErrorが表示された場合の対処方法
これで、クリーン→実行をすると見事動作しました。
jarファイルがエクスポートされていないことが原因だったようです。