@niwakk7 iPhoneアプリ作っていますよ

iPhoneアプリ作ってます。調べたことを、ゆるく残していきます。

TextField押下でPickerViewを下から出す。

f:id:niwakk7:20140902182623j:plain:w200

画面下部から、ピッカーをにゅって出すのはとてもUIなんだが、実装するのに少し工夫しなければいけない。ちなみに以前は、UIActionSheetの上にのせるという方法をとっていた。しかし、iOS8でUIActionSheetやUIAlertViewが大きく変わるため、動かなくなる。そういうときには、この方法を使うとよい。

簡単に言うと、UITextField押下時に下から出てくるキーボードにピッカーをのせる。ただやるだけだと、ピッカー以外の部分のViewが反応してしまうため、Viewを一枚のせてユーザの誤動作を防ぐようにするとよい。

#import "ViewController.h"

@interface ViewController () <UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate>

@property (nonatomic, retain)   UITextField *textField;
@property (nonatomic, retain)   UIPickerView *pickerView;
@property (nonatomic, retain)   UIView *backView;
@property (nonatomic, strong)   NSArray *items;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.items = @[@"A",@"B", @"C",@"D",];
    
    _textField = [[UITextField alloc] initWithFrame:CGRectMake(60, 100, 200, 30)];
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    self.textField.textColor = [UIColor blueColor];
    self.textField.placeholder = @"";
    self.textField.delegate = self;
    [self.view addSubview:self.textField];
    
    _pickerView = [[UIPickerView alloc] init];
    self.pickerView.delegate = self;
    self.pickerView.dataSource = self;
    self.pickerView.showsSelectionIndicator = YES;
    
    self.textField.inputView = self.pickerView;

    UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    toolBar.barStyle = UIBarStyleBlackOpaque;
    [toolBar sizeToFit];
    
    UIBarButtonItem *spacer = [[UIBarButtonItem alloc]
                               initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                               target:nil action:nil];
    
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                          target:self
                                                                          action:@selector(donePushed)];

    NSArray *items = [NSArray arrayWithObjects:spacer, done, nil];
    [toolBar setItems:items animated:YES];

    self.textField.inputAccessoryView = toolBar;
    
    _backView = [[UIView alloc] initWithFrame:self.view.frame];
    self.backView.backgroundColor = [UIColor blackColor];
    self.backView.alpha = 0.2;
    self.backView.hidden = YES;
    self.backView.userInteractionEnabled = NO;
    [self.view addSubview:self.backView];
}

- (void)donePushed
{
    self.backView.hidden = YES;
    [self.textField resignFirstResponder];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    self.backView.hidden = NO;
    
    return YES;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [self.items count];
}

- (NSString *)pickerView:(UIPickerView*)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return self.items[row];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    self.textField.text = [self.items objectAtIndex:row];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

ViewControllerのソースをのっけた。
雑で申し訳ない。

※追記
Githubにあげました。

niwakk7/TextFieldPicker · GitHub

NSLocalizedStringで、設定している日本語が表示されない。

ローカライズしたはずの日本語が出ない事象が発生!

Localizable.string (English)にて、

"Close" = "Close";

Localizable.string (Japanese)にて、

"Close" = "閉じる";
NSLocalizedString (@"Close", nil);

んー、うまく表示されない。cleanもして、Xcode立ち上げ直して、いろいろやったができない。

そして...

アプリをいったん端末から削除したらなおりました!

localization - Localizable.strings not working in iOS - Stack Overflow

UITableViewのindexPathからセルを取得する。

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

The Simulator can't be launched because it is already in use.でSimulatorが立ち上がらない。

Simulatorを立ち上げていないのに、

The Simulator can't be launched because it is already in use.

と、すでに立ち上がっていることになってしまう場合の対処法。

Xcodeを一旦終了させる。

UITabBarItemのtitleが表示されない!

これはよくある現象らしい。

http://stackoverflow.com/questions/5573966/uitabbaritem-title-not-displayed

ちなみに僕は、以下のように修正してなおりました。

修正前:

    UITabBarController *tabBarController = [[UITabBarController alloc] init];

    UITabBarItem *tabBarItem1 = [tabBarController.tabBar.items objectAtIndex:0];
    tabBarItem1.title = @"画面1";
    UITabBarItem *tabBarItem2 = [tabBarController.tabBar.items objectAtIndex:1];
    tabBarItem2.title = @"設定";

    NSArray *views = [NSArray arrayWithObjects:sideMenuController, settingNavigationController, nil];
    [tabBarController setViewControllers:views animated:NO];
	self.window.rootViewController = tabBarController;

修正後:

    UITabBarController *tabBarController = [[UITabBarController alloc] init];

    NSArray *views = [NSArray arrayWithObjects:sideMenuController, settingNavigationController, nil];
    [tabBarController setViewControllers:views animated:NO];

    UITabBarItem *tabBarItem1 = [tabBarController.tabBar.items objectAtIndex:0];
    tabBarItem1.title = @"画面1";
    UITabBarItem *tabBarItem2 = [tabBarController.tabBar.items objectAtIndex:1];
    tabBarItem2.title = @"設定";

    self.window.rootViewController = tabBarController;

ようは、タイトルを設定する前にちゃんとtabBarControllerの配列を設定しとけと。はい。たしかに。けど、何故かこうやらなくても右側だけは表示されてた。まぁよいか。

cocoaPodsインストール覚え書き

ちょっと雑な覚え書きで申し訳ないが、まぁ、メモ程度に...

1. プロジェクトファイルと同じディレクトリに移動。

2. RubyGemsを最新状態に更新

$sudo gem update --system

3. Command Line Toolsをインストール。

Xcode->Preferences->Downloads->Components

4. cocoapodsをインストール

$sudo gem install cocoapods

5. インストールの終了確認

$ pod --version
バージョン番号が表示されることを確認。

6. プロジェクトファイルと同じディレクトリにて、Podfileファイルを作成。

7. 以下のように編集。

platform:ios,"6.0"
pod 'TWSReleaseNotesView', '~> 1.2.0'

※TWSReleaseNotesViewを入れると仮定。

8. ライブラリのインストール

$ pod install

9. XXX.xcwordspaceをたたいてプロジェクトを開く。

10. Podsプロジェクトがあることを確認。

UIAlertViewにUITextFieldをのせる。

このようなUIを作るときの覚え書き。

f:id:niwakk7:20140315234410j:plain:w160

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"タイトル"
                                                    message:@"メッセージ"
                                                   delegate:self
                                          cancelButtonTitle:@"キャンセル"
                                          otherButtonTitles:@"OK", nil];
    
    alert.delegate = self;
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    alert.frame = CGRectMake(0, 50, 300, 300);
    UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45.0, 260.0, 25.0)];
    field.placeholder = @"入力";
    field.borderStyle = UITextBorderStyleRoundedRect;
    [field setBackgroundColor:[UIColor whiteColor]];
    field.delegate = self;
    field = [alert textFieldAtIndex:0];
    [alert addSubview:field];
    [alert show];