Archive for the ‘iOS’ Category

iOS | UITableViewでcell内のコンテンツが二重に描画される

2014-01-16

UITableViewを使っていて問題発生。
TableViewのcellに設定したUILabelやUIButtonが描画される度、二重、三重に表示される。
調べてたら解決策を発見。描画されたサブビューを取り除く必要があったみたい。
cellForRowAtIndexPath内でremoveFromSuperviewで取り除く。
[objc]
– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// サブビューを取り除く
for (UIView *subview in [cell.contentView subviews])
{
[subview removeFromSuperview];
}
}
[/objc]

iOS | ASOツールFlurryの導入(実装でエラー)

2013-11-11

アプリのアクセス解析をしてくれるツール「Flurry」を導入しようとしたが、ビルドするとエラーが・・・
原因はライブラリをインポートしてなかっただけでした。
Flurryを使うときライブラリのインポートが必要みたい。

以下かんたんに実装方法

①Flurryサイトに登録しSDKダウンロード。
②SDKの「Flurry」フォルダをそのままプロジェクトにコピー
③プロジェクトの「TARGET」→「Build Phase」→「Link Binary With Libraries」に以下のライブラリ追加
・SystemConfiguration.framework
・Security.framework
・AdSupport.framework
④プロジェクトのAppDelegate.mでFlurryをインポート
⑤AppDelegate.m内のdidFinishLaunchingWithOptionsでAPI_KEYの設定
[objc]
#import "AppDelegate.h"
#import "Flurry.h"

@implementation AppDelegate

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
[Flurry startSession:@"YOUR_API_KEY"];
return YES;
}
[/objc]

ちなみにAPI_KEYの確認方法はFlurryサイトのApplicationsの名前をクリックして「Manage」から見れます。

iOS | 実機に転送したアプリのデータベースを確認する

2013-08-15

以前シミュレータに転送したアプリのデータベースを確認するというのをやったけど、じゃあ実機に転送した場合はどうなんだということがあったのでメモ。

①xcodeでorganizerを開く



②アプリを転送した端末の「Applications」を選択し、中身を見たいアプリを選択。下の「Download」をクリック。保存先はデスクトップにでも。



③ダウンロードしたファイルを右クリックし、「パッケージの内容を表示」をクリックする。



④「AppData」→「Documents」と開けばデータベースを確認することができます。


iOS | UIPickerViewをUIActionSheet内に出す(かつPickerを複数設定)

2013-08-05

テキストフィールドに入力する時、キーボードじゃなくてピッカーで入力させたいな〜と思ったので、その備忘録。
尚且つ、テキストフィールドごとにピッカーの内容を変えるやり方。
まずはヘッダーファイル。
[objc]
ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITextFieldDelegate, UIActionSheetDelegate, UIPickerViewDelegate, UIPickerViewDataSource> {

UIActionSheet *actionSheet;
}

@property (weak, nonatomic) IBOutlet UITextField *textField1; //StoryBoardでOutlet接続
@property (weak, nonatomic) IBOutlet UITextField *textField2; //StoryBoardでOutlet接続

@end
[/objc]
次はソースファイル。
[objc]
ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
UIPickerView *picker1;
UIPickerView *picker2;

NSString *pic1_str;
NSString *pic2_str;
}
@synthesize textField1;
@synthesize textField2;
– (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
textField1.delegate = self;
textField2.delegate = self;
textField1.tag = 1;
textField2.tag = 2;

CGRect rect = [[UIScreen mainScreen] bounds];

picker1 = [[UIPickerView alloc] init];
picker1.frame = CGRectMake(0, rect.size.height, 320, 216);
picker1.showsSelectionIndicator = YES;
picker1.delegate = self;
picker1.dataSource = self;
picker1.tag = 1;
[self.view addSubview:picker1];

picker2 = [[UIPickerView alloc] init];
picker2.frame = CGRectMake(0, rect.size.height, 320,216);
picker2.showsSelectionIndicator = YES;
picker2.delegate = self;
picker2.dataSource = self;
picker2.tag = 2;
[self.view addSubview:picker2];
}

– (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
– (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
CGRect rect = [[UIScreen mainScreen] bounds];
if (textField.tag == 1) {
NSLog(@"1");
picker2.frame = CGRectMake(0, rect.size.height, 320, 216);
[self showPicker1]; //picker1を表示させるメソッドを実行
//キーボードは表示させない
return NO;
}
if (textField.tag == 2) {
NSLog(@"2");
picker1.frame = CGRectMake(0, rect.size.height, 320, 216);
[self showPicker2]; //picker2を表示させるメソッドを実行
//キーボードは表示させない
return NO;
}
return NO;
}

– (void)showPicker1 {
// アクションシートの作成
actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
// ツールバーの作成
UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
toolBar.barStyle = UIBarStyleBlackOpaque;
[toolBar sizeToFit];
// ピッカーの作成
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 0, 0)];
pickerView.tag = 1;
pickerView.delegate = self;
pickerView.showsSelectionIndicator = YES;
// Cancelボタンの作成
UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelDidPush)];
// フレキシブルスペースの作成
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
// Doneボタンの作成
UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneDidPush)];
NSArray *items = [NSArray arrayWithObjects:cancel, spacer, done, nil];
[toolBar setItems:items animated:YES];
// アクションシートへの埋め込みと表示
[actionSheet addSubview:toolBar];
[actionSheet addSubview:pickerView];
[actionSheet showInView:self.view];
[actionSheet setBounds:CGRectMake(0, 0, 320, 464)];
}
– (void)showPicker2 {
// アクションシートの作成
actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
// ツールバーの作成
UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
toolBar.barStyle = UIBarStyleBlackOpaque;
[toolBar sizeToFit];
// ピッカーの作成
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 0, 0)];
pickerView.tag = 2;
pickerView.delegate = self;
pickerView.showsSelectionIndicator = YES;
// Cancelボタンの作成
UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelDidPush)];
// フレキシブルスペースの作成
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
// Doneボタンの作成
UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneDidPush)];
NSArray *items = [NSArray arrayWithObjects:cancel, spacer, done, nil];
[toolBar setItems:items animated:YES];
// アクションシートへの埋め込みと表示
[actionSheet addSubview:toolBar];
[actionSheet addSubview:pickerView];
[actionSheet showInView:self.view];
[actionSheet setBounds:CGRectMake(0, 0, 320, 464)];
}

– (void)cancelDidPush {
// アクションシートの非表示
[actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}

– (void)doneDidPush {
/* 処理 */
// アクションシートの非表示
[actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}

– (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)picker {

// ピッカーの列数
return 1;
}

– (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
// ピッカーの行数
if (pickerView.tag == 1)
{
return 5;
}
else if (pickerView.tag == 2)
{
return 4;
}
return 0;
}

– (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (pickerView.tag==1)
{
if (component == 0) {
NSString *album[] = {@"1", @"2", @"3", @"4", @"5"};
return album[row];
}
else {
return @"";
}
}
else if (pickerView.tag==2)
{
if (component == 0) {
NSString *album[] = {@"A", @"B", @"C", @"D"};
return album[row];
}
else {
return @"";
}
}
return @"";
}
– (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (pickerView.tag == 1) {
NSArray *arr = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",nil];
pic1_str = [NSString stringWithFormat:@"%@",[arr objectAtIndex:row]];
textField1.text = pic1_str;
}
if (pickerView.tag == 2) {
NSArray *arr = [[NSArray alloc] initWithObjects:@"A",@"B",@"C",@"D",nil];
pic2_str = [NSString stringWithFormat:@"%@",[arr objectAtIndex:row]];
textField2.text = pic2_str;
}
}
@end
[/objc]

iOS | Assigning to ‘id’ from incompatible type ‘viewController *const __strong’

2013-08-05

.mファイルのtextFieldに「Assigning to ‘id‘ from incompatible type ‘viewController *const __strong’」のエラーが発生。
.hファイルでUITextFieldDelegateを宣言したら治った\(^o^)/
[objc]
ViewController.h

@interface ViewController : UIViewController<UITextFieldDelegate>
[/objc]

iOS | UINavigationControllerの画面遷移アニメーションをページカール(ページめくり)にする

2013-07-29

①TARGET→Build Phases→Link Binary With Librariesの「+」ボタンを押して「QuartzCore.framework」をインポートする。
②遷移元の○○ViewController.hにQuartzCoreをインポートする。
③StoryBoardで遷移用のボタンを配置し、Action設定をする。(例:tapNextButton)
④StoryBoard上で「遷移元の」ViewControllerの「StoryBoard ID」を設定しておく。(Class名と同じで良い:◎◎◎ViewControllerなど)←右側のIdentity Inspectorにて
⑤遷移元の○○ViewController.mで画面遷移の設定をする。

○○ViewController.h
[objc]
#import <QuartzCore/QuartzCore.h>
[/objc]
○○ViewController.m
[objc]
– (IBAction)tapNextButton:(id)sender
{
CATransition *transition = [CATransition animation];
transition.duration = 0.8;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// ページめくり
transition.type = @"pageCurl";
// 右から
transition.subtype = kCATransitionFromRight;

// NavigationController のアニメーションを変更する
[self.navigationController.view.layer addAnimation:transition forKey:nil];

 ◎◎◎ViewController *viewContoller = [self.storyboard instantiateViewControllerWithIdentifier:@"◎◎◎ViewController"];
[self.navigationController pushViewController:viewContoller animated:NO];
}
[/objc]

iOS | iPhone用アプリをiPad対応のuniversalにする

2013-07-24

1,Finder上でStoryboardを複製して、名前を「MainStoryboard_iPad」などにする。
2,テキストエディタで「MainStoryBoard_iPad」を開く。
3,「targetRuntime=”iOS.CocoaTouch”」 という場所を見つけ、「targetRuntime=”iOS.CocoaTouch.iPad”」 変更する。
4,「width=”320″」「height=”504″」もしくは「height=”480″」の場所を全て変更する。「320」→「768」、「548」「480」→「1024」
5,プロジェクトに追加。
6,TARGETのSummaryでDevicesをUniversalに変更。
7,Universalに変更すると、Summary内に「iPad Deployment Info」ができるので、そこの「Main Storyboard」を「MainStoryboard_iPad」に変更する。
8,これでiPadの場合は「MainStoryboard_iPad」が読み込まれるようになりました。後は「MainStoryboard_iPad」を微調整します。
9,ソースコード内でiPhoneとiPadの判定が必要な時は
[objc]
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// iPad
} else {
// それ以外
}
[/objc]
を使ってそれぞれのソースを書きます。

iOS | アプリが端末のホームアイコンの下に表示される時の名前を変更する

2013-07-24

プロジェクト名「sample」でアプリを作ると、iPhoneのホームアイコンの下の名前も「sample」になっちゃう。
プロジェクト名を変えたらプロビジョニングファイルのエラーが出るし…

そんな時は「TARGET」ー「Info」タブを選択し、「Bundle display name」パラメータを変更します。

ちなみに初期設定の${PRODUCT_NAME}は「Product Name」パラメータの設定値のことです。
「Product Name」パラメータの初期値は${TARGET_NAME}が設定されており、これがプロジェクト名を指しています。
プロジェクト名の変更は、プロジェクトを選択してでFile Inspectorの「Project Name」を変更するだけです。

iOS | アプリ内でiPadとiPhoneを識別する

2013-07-23

これで出来ました

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// iPad
} else {
// それ以外
}

iOS | シミュレータに転送したアプリのデータベースを確認する

2013-07-16

①ファインダーを開く
②上部ツールバーの「移動」を押す
③optionキーを押すと「ライブラリ」が表示されるので、クリックする
④「Application Support」のフォルダをクリック
⑤「iPhone Simulator」のフォルダをクリック
⑥「6.1」などの使用したバージョンをクリック
⑦「Applications」フォルダをクリック
⑧「54BE346BJYR-・・・・・・・」などの長い名前のフォルダが出てくるので、クリックする
⑨目的のアプリを見つけて「Documents」フォルダをクリック
⑩リソースにインストールされたdbファイルがあります。

« Older Entries
Copyright(c) 2015 AndByYOU INC. All Rights Reserved.