文字列の検索と置換
一度はきっと困ってしまう、文字列関係のサンプルを2つアップしました。
まず始めは文字列の検索と置換。TextFieldに入力された文字列をいぢるサンプルはあまり見られなかったので投下しました。
TextFieldに入力された文字列を検索して「あか」があった場合は「あか」を「なはなは」に置き換えてラベルに表示。かつ特定の範囲内のランダムな位置に画像を表示しています。
具体的なコードは以下です。日本語となっていますが、英語もおk。
GitHub - prince9/TextMatchJapanese: 日本語の文字列検索と置換を行い、ラベルに表示します。Sorry,only the Japanese character string is treated.
追加するコードは以下です。新規プロジェクトを作ったときに書かれているコードは一部省略しています。
・ViewController.h
@interface ViewController : UIViewController {
int x;
int y;
}
//テキスト入力
@property (weak, nonatomic) IBOutlet UITextField *myField;
//入力したテキストをそのまま表示
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
//文字列を検索して特定の文字列があるかどうか判定、あるかないかを表示
@property (weak, nonatomic) IBOutlet UILabel *hantei;
@property (weak, nonatomic) IBOutlet UIImageView *myimage;
@property (weak, nonatomic) IBOutlet UIImageView *myimage2;
//特定の文字列を特定の文字列に置き換える
@property (weak, nonatomic) IBOutlet UILabel *chikan;
- (IBAction)textInput:(id)sender;
//文字列検索判定+置き換え開始ボタン
- (IBAction)hanteiButton:(id)sender;
・ViewController.m
...
- (IBAction)textInput:(id)sender {
myLabel.text = myField.text;
}
- (IBAction)hanteiButton:(id)sender {
/* TextFieldに入力した文字列の検索、検索結果はhantei.textに出力
・「あか」があれば黒いちょうちょをxは20-150、yは120-320の範囲のランダムな位置に表示して、白いちょうちょを消します
・「さた」があれば白いちょうちょをxは20-150、yは120-320の範囲のランダムな位置に表示して、黒いちょうちょを消します
・該当する文字列がないときは黒いちょうちょ・白いちょうちょともに消します
*/
//文字列検索の準備
//NSRange 変数 = [《NSString*》 rangeOfString:《NSString*》];
NSRange searchResult = [myField.text rangeOfString:@"あか"];
NSRange searchResult2 = [myField.text rangeOfString:@"さた"];
//入力した文字列に「あか」があった場合の処理
if (searchResult.location != NSNotFound){
hantei.text = @"あるよ";
myimage.image = [UIImage imageNamed:@"fly1omin.png"];
//Xは20-150、yは120-320の範囲でランダムな数を出力、それを画像の表示位置に
x = arc4random() % 131 + 20;
y = arc4random() % 201 + 120;
myimage.center = CGPointMake(x, y);
myimage2.image = nil;
}
//入力した文字列に「さた」があった場合の処理
else if (searchResult2.location != NSNotFound) {
hantei.text = @"あるよ";
myimage2.image = [UIImage imageNamed:@"fly4mino.png"];
//Xは20-150、yは120-320の範囲でランダムな数を出力、それを画像の表示位置に
x = arc4random() % 131 + 20;
y = arc4random() % 201 + 120;
myimage2.center = CGPointMake(x, y);
myimage.image = nil;
}
//入力した文字列に「あか」も「さた」もなかった場合の処理
else{
hantei.text = @"ないよ";
//画像を消す
myimage.image = nil;
myimage2.image = nil;
}
//「あか」があった場合、「なはなは」と置き換えてラベルに表示 例:「あかいいろ」→「なはなはいいろ」
NSString *str1 = myField.text;
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"あか" withString:@"なはなは"];
chikan.text = [NSString stringWithFormat:@"%@",str2];
}
文字列の検索と削除
次は文字列の検索と削除です。
先頭から○文字まで削除などはありますが、入力された文字列から特定の文字列を削除するというサンプルは見当たらなかったので投下しました。
サンプルはこちらです。英語と書かれていますが、日本語もおkです。
GitHub - prince9/TextAddEnglish: An addition and deletion of a specific character string are performed in the inputted text, and it displays on a label. 入力されたテキストに特定の文字列の追加と削除を行い、ラベルに表示します。文字列が英語になっていますが、日本語もおk
特定の文字列の削除はこのような感じ。
NSString *文字列3 = [文字列1(←入力された文字列) stringByReplacingOccurrencesOfString:文字列2(←削除する文字列) withString:@""(←消す)];
具体的には、
NSString *str3 = [str1 stringByReplacingOccurrencesOfString:str2 withString:@""];
となります。
TextFieldに入力された文字列を検索して「not」があった場合は「not」を削除してラベルに表示。「not」がなかった場合は先頭に「No_」という文字列を追加しています。
かつ特定の範囲内のランダムな位置に画像を表示しています。
以下、追加するコードです。新規プロジェクトを作ったときに書かれているコードは一部省略しています。
・ViewController.h
@interface ViewController : UIViewController {
int x,y;
}
//テキスト入力
@property (weak, nonatomic) IBOutlet UITextField *myField;
//入力したテキストをそのまま表示
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
//文字列を検索して特定の文字列があるかどうか判定、あるかないかを表示
@property (weak, nonatomic) IBOutlet UILabel *Judg;
@property (weak, nonatomic) IBOutlet UIImageView *myimage;
@property (weak, nonatomic) IBOutlet UIImageView *myimage2;
//特定の文字列を入力された文字列に加えたり削除したものを表示
@property (weak, nonatomic) IBOutlet UILabel *Add;
- (IBAction)textInput:(id)sender;
//文字列検索判定+文字追加開始ボタン
- (IBAction)JudgBtn:(id)sender;・ViewController.m
...
- (IBAction)textInput:(id)sender {
myLabel.text = myField.text;
}
- (IBAction)JudgBtn:(id)sender {
/*
TextFieldに入力した文字列の検索、検索結果はJudg.textに出力
・「app」があれば黒いちょうちょをxは20-150、yは120-320の範囲のランダムな位置に表示して、白いちょうちょを消します
・「store」があれば白いちょうちょをxは20-150、yは120-320の範囲のランダムな位置に表示して、黒いちょうちょを消します
・該当する文字列がないときは黒いちょうちょ・白いちょうちょともに消します
*/
//文字列検索の準備
//NSRange 変数 = [NSString* rangeOfString:NSString*];
NSRange searchResult = [myField.text rangeOfString:@"app"];
NSRange searchResult2 = [myField.text rangeOfString:@"store"];
//入力した文字列に「app」があった場合の処理
if (searchResult.location != NSNotFound) {
Judg.text = @"Yes";
myimage.image = [UIImage imageNamed:@"fly1omin.png"];
//Xは20-150、yは120-320の範囲でランダムな数を出力、それを画像の表示位置に
x = arc4random() % 131 + 20;
y = arc4random() % 201 + 120;
myimage.center = CGPointMake(x, y);
myimage2.image = nil;
}
//入力した文字列に「store」があった場合の処理
else if (searchResult2.location != NSNotFound) {
Judg.text = @"Yes";
myimage2.image = [UIImage imageNamed:@"fly4mino.png"];
//Xは20-150、yは120-320の範囲でランダムな数を出力、それを画像の表示位置に
x = arc4random() % 131 + 20;
y = arc4random() % 201 + 120;
myimage2.center = CGPointMake(x, y);
myimage.image = nil;
}
//入力した文字列に「app」も「store」もなかった場合の処理
else{
Judg.text = @"None";
//画像を消す
myimage.image = nil;
myimage2.image = nil;
}
//入力した文字に「not」があった場合は「not」を削除。一応英語にしてますが、日本語でもおk。その場合は「not」を日本語にしてください
NSRange searchResult3 = [myField.text rangeOfString:@"not"];
if (searchResult3.location != NSNotFound) {
NSString *str1 = myField.text;
NSString *str2 = @"not";
//文字列の削除、Deletion of a character string.
//NSString *文字列3 = [文字列1(←入力された文字列) stringByReplacingOccurrencesOfString:文字列2(←削除する文字列) withString:@""(←消す)];
//例:入力された文字列が「I do not play tennis. 」、削除する文字列が「not」の場合、以下だと「I do play tennis.」になる
NSString *str3 = [str1 stringByReplacingOccurrencesOfString:str2 withString:@""];
Add.text = [NSString stringWithFormat:@"%@",str3];
}
//「not」がなかった場合は入力した文字の先頭に「No_(←半角スペース)」を付け足した文字列をラベルで表示
else {
NSString *str4 = @"No ";
NSString *str5 = myField.text;
NSString *str6 = [str4 stringByAppendingString:str5];
Add.text = [NSString stringWithFormat:@"%@",str6];
}
}
Storyboardでボタンを押してデータを送信
★追記しました。
Storyboard+TabBarでのデータ受け渡しの記事を下のほうに追加しました。
Storyboardを使ってデータのやりとりを・・・となると- (void)prepareForSegue:を使うのが一般的ですが、これだと次の画面へ行くボタンを押したときにしかデータが送信されません。
そこで、単純にボタンを押すとデータが送信されて次の画面で表示するというコードを書きました。
例のごとくサンプルをgithubに上げておきました。
GitHub - prince9/DataSendStoryboard: Button is pushed and data is sent to the next screen.Data is not transmitted by -(void)prepareForSegue: and data is transmitted by pushing a button.Storyboardを使ってデータの受け渡しをする一般的な方法である「 -(void)prepareForSegue:」を使わずにVIewとVIewでデータの受け渡しをしています。
流れとしては、AppDelegate.hで変数とプロパティを用意→ViewController.mでデータを送る準備→SecondViewController.mで受け取って表示するという感じです。
以下、追加するコードになります。コードを書く前にViewを追加したりなど少し準備がいりますので、詳しくはReadMeをご覧ください。
新規プロジェクトを作ったときに既に追加されているコードは所々省いていることがあります。詳細は上のサンプルでご確認ください。
・AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
NSString *labelData1;
NSString *labelData2;
}
@property (strong, nonatomic) NSString *labelData1;
@property (strong, nonatomic) NSString *labelData2;・ViewController.h
@interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UISlider *mySlider; @property (weak, nonatomic) IBOutlet UITextField *myField; - (IBAction)KeyHide:(id)sender; - (IBAction)detaSend:(id)sender;
・ViewController.m
#import "ViewController.h"
#import "AppDelegate.h"
@implementation ViewController
@synthesize mySlider;
@synthesize myField;
...
- (IBAction)KeyHide:(id)sender {
//キーボードをしまう
[myField resignFirstResponder];
}
//ボタンを押すとデータを送る
- (IBAction)detaSend:(id)sender {
//データを送る準備
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.labelData1 = [NSString stringWithFormat:@"%f",mySlider.value];
appDelegate.labelData2 = myField.text;
}・SecondViewController.h
@interface SecondViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *myLabel1; @property (weak, nonatomic) IBOutlet UILabel *myLabel2; - (IBAction)goBack:(id)sender;
・SecondViewController.m
#import "SecondViewController.h"
#import "AppDelegate.h"
@implementation SecondViewController
@synthesize myLabel1;
@synthesize myLabel2;
...
- (void)viewDidLoad
{
[super viewDidLoad];
//データを受け取って、ラベルに表示する
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
myLabel1.text = appDelegate.labelData1;
myLabel2.text = appDelegate.labelData2;
}
...
//前の画面に戻る。IBで接続するよりメモリ的にこうやって書いたほうが良いらしい
- (IBAction)goBack:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
追記分:Storyboard+TabBarでボタンを押してデータを送信
更にStoryboard+Tabbarでボタンを押して次のタブへデータを送るコード書きました。
コードのダウンロードは以下です。
GitHub - prince9/SBTabDataSend: Sent data to the next Tab using Storyboard.TabBarでStoryboardを使ってデータの受け渡しをします
タブの切り替えでデータの送信を行っているのではなく、別途ボタンを設置してそのボタンを押してデータを送ってます。前のタブに戻ってデータを確認したい、データ入力を確定させてからデータを送りたいという場合に使用できるかと思います。
Viewの追加は特に必要なく、Tabbed Applicationを選択して新しくプロジェクトを作ります。後はUI設置&関連づけをして、追記分を書くだけでOK。
TabBarで注意しなければいけないのは、普段viewDidLoadに書くような処理をviewWillAppearに書かなければいけない点です。
おそらく読み込みの順番のせいだと思いますが、viewDidLoadに書くと正常に動かないので注意してください。
以下が追加するコードになります。新規プロジェクトを作ったときに既に追加されているコードは所々省いていることがあります。詳細は上のサンプルでご確認ください。
・AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
//追加
NSString *labelData1; //スライダのデータを送る変数
NSString *labelData2; //TextFieldに入力されたデータを送る変数
}
...
//labelData1、labelData2というプロパティを作る
@property (strong, nonatomic) NSString *labelData1;
@property (strong, nonatomic) NSString *labelData2;・FirstViewController.h
@interface FirstViewController : UIViewController @property (weak, nonatomic) IBOutlet UISlider *mySlider; @property (weak, nonatomic) IBOutlet UITextField *myField; //キーボードを隠すボタン - (IBAction)KeyHide:(id)sender; //データを送るボタン - (IBAction)detaSend:(id)sender;
・FirstViewController.m
#import "FirstViewController.h"
#import "AppDelegate.h"
@implementation FirstViewController
@synthesize mySlider;
@synthesize myField;
...
- (IBAction)KeyHide:(id)sender {
//キーボードをしまう
[myField resignFirstResponder];
}
//ボタンを押すとデータを送る
- (IBAction)detaSend:(id)sender {
//データを送る準備
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.labelData1 = [NSString stringWithFormat:@"%f",mySlider.value];
appDelegate.labelData2 = myField.text;
}・SecondViewController.h
@interface SecondViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *myLabel1; @property (weak, nonatomic) IBOutlet UILabel *myLabel2;
・SecondViewController.m
#import "SecondViewController.h"
#import "AppDelegate.h"
@implementation SecondViewController
@synthesize myLabel1;
@synthesize myLabel2;
...
//画面が表示される直前に実行される処理を書く。TabBarの場合、- (void)viewDidLoadに以下の処理を書くと正常に表示されない
- (void)viewWillAppear:(BOOL)animated
{
//データを受け取って、ラベルに表示する
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
myLabel1.text = appDelegate.labelData1;
myLabel2.text = appDelegate.labelData2;
[super viewWillAppear:animated];
}
目次を作成しました
iPhoneの記事が多くなってきたので、目次を作成しました。
・配列をフィルタリングする
http://d.hatena.ne.jp/prince9/20121029/1351535526
・カスタムセルにボタンを追加して処理を行う
http://d.hatena.ne.jp/prince9/20121028/1351454813
・数秒後に特定の処理を実行する
http://d.hatena.ne.jp/prince9/20121028/1351375933
・UILabelを大量に作る
http://d.hatena.ne.jp/prince9/20121027/1351370948
・Objective-CでYahooテキスト解析APIのキーワード抽出を使う
http://d.hatena.ne.jp/prince9/20121027/1351361731
・元の文を入れ替えて違う文にする
http://d.hatena.ne.jp/prince9/20121025/1351188033
・連番ファイルを読み込んで表示
http://d.hatena.ne.jp/prince9/20121004/1349371979
・iOS6でTwitterのタイムラインを取得
http://d.hatena.ne.jp/prince9/20121003/1349290283
・文字列を大量の条件で置換する(下のよりこっちのほうが楽です)
http://d.hatena.ne.jp/prince9/20121003/1349283960
・フェードイン/アウト、上下運動のアニメーション
http://d.hatena.ne.jp/prince9/20120920/1348161726
・複数の条件で文字を置換する(上にもっと楽なやり方あり)
http://d.hatena.ne.jp/prince9/20120920/1348098815
・辞書の値をもとにソートする
http://d.hatena.ne.jp/prince9/20120917/1347909828
・テキストを単語に分けて、いちばん長い単語を抽出
http://d.hatena.ne.jp/prince9/20120917/1347873368
・Twitter検索してラベルに表示
http://d.hatena.ne.jp/prince9/20120917/1347838006
・Twitter検索してヒット数を表示(ただし取得したタイムライン内の数)
http://d.hatena.ne.jp/prince9/20120917/1347836149
・文字列をOR検索してヒット数を出す
http://d.hatena.ne.jp/prince9/20120917/1347832261
・文字列の中で最も長いものを取り出す
http://d.hatena.ne.jp/prince9/20120915/1347731611
・カスタムセルでUILabelの文字数に合わせてセルの高さを変える
http://d.hatena.ne.jp/prince9/20120804/1344032517
・Twitterトレンドをアクションシートに表示する
http://d.hatena.ne.jp/prince9/20120519/1337384953
・表示されてるツイートを「お気に入り」にポストする
http://d.hatena.ne.jp/prince9/20120516/1337162307
・Twitterの特定ワードの検索ヒット数を表示する、テキストのフェードイン/アウト
http://d.hatena.ne.jp/prince9/20120515/1337099813
・iOS5のTwitter.frameworkを使ってつぶやきをカスタムテーブルで表示する
http://d.hatena.ne.jp/prince9/20120515/1337097488
・Tabbarでアプリ初回起動時にヘルプ画面(ImageView)を表示
http://d.hatena.ne.jp/prince9/20120429/1335658912
・TextFieldにテキストを入力したとき画面の下が隠れてしまわないようにする方法
http://d.hatena.ne.jp/prince9/20120425/1335386280
・TabbarでCoreDataを使う(カスタムセルを使用)2
http://d.hatena.ne.jp/prince9/20120420/1334947795
・入力したテキストをTwitterで検索して結果をカスタムテーブルで表示
http://d.hatena.ne.jp/prince9/20120419/1334861356
・Notificationを使ってTabbarで他のタブからTableViewのセルを追加する
http://d.hatena.ne.jp/prince9/20120417/1334695483
・TabbarでNotificationを使ってデータ送信&-(void)〜を実行
http://d.hatena.ne.jp/prince9/20120416/1334602234
・デフォルトのダイアログではなくTextFieldからツイートする
http://d.hatena.ne.jp/prince9/20120407
・文字列の検索と削除
http://d.hatena.ne.jp/prince9/20120331/1333224255
・文字列の検索と置換
http://d.hatena.ne.jp/prince9/20120331/1333222551
・Storyboardでボタンを押してデータを送信
http://d.hatena.ne.jp/prince9/20120331/1333146327
・Storyboard+TabBarでボタンを押してデータを送信
http://d.hatena.ne.jp/prince9/20120331/1333172176
・TabbarでCoreDataを使う
http://d.hatena.ne.jp/prince9/20120326/1332779829
・iPhoneのセンサの数値を滑らかにする
http://d.hatena.ne.jp/prince9/20111127/1322419442