9/16修正しました:iOS5のTwitter.frameworkを使ってつぶやきをカスタムテーブルで表示する
以前ここにメモした「入力したテキストをTwitterで検索して結果をカスタムテーブルで表示」では
json-frameworkという外部ファイルをダウンロードして組み込まなければいけませんでした。
今回はそれを使うのではなく、iOS5から標準で追加されたTwitter.frameworkを使ってつぶやきをカスタムテーブルで表示してみました。
サンプルはこちらです。
すみません、以前のものだと他のキーワードを入力したらテーブルがその結果に書き変わらなかったので、修正しました。
流れは
1.Single View -Applicationで新規プロジェクトを作る。「TARGET」→「Linked Framework and Libraries」の下の「+」ボタンを押して「Accounts.framework」「Twitter.framework」「QuartzCore.framework」を追加
2.Storyboardをクリックし、Navigation Controllerを持って行く。Navigation Controllerにくっついているテーブルを消す。さらに元からあったViewControllerについている「→」をNavigation Controllerの先頭に持っていく。そしてNavigation Controllerを右クリックして元からあったViewControllerに結びつける。このときいちばん上のRelationshipを選ぶ
3.Storyboardにそれぞれパーツを設置、ViewControllerのTableViewのみひもづけて、後はパーツを置くだけにする
4.この例だと「TweetSearchAPIiOS5」フォルダを右クリックしてNewFile..を選ぶ。Objective-C class→Classに好きな名前を入れてSub classをUIViewControllerにして、新しくUIViewControllerを作る
5.Storyboardに新しくViewControllerを持って行く。Table View Cellを右クリックして新しく作ったViewControllerと結びつける。そのときpushを選ぶ
6.Storyboardで新しく作ったViewControllerをクリックし、Classを新しく作ったViewControllerの名前にする
7.Table View Cellをクリックし、Identiferに「tweetCell」と入力する
8.コードを追加
9.一度Runした後、ひとつひとつのツイートの文字数を見てTable ViewやTable View CellのRow heightを調整する
背景画像を設定したりなど、カスタムテーブルの設定については過去のこちらの記事を参照ください。
ほとんどこれと変わりがないのですが、違う部分だけ書いておきます。
・ViewController.m
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //以下追加 accountStore = [[ACAccountStore alloc] init]; accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; //追加、これを忘れるとデータが表示できない tweetTable.delegate = self; tweetTable.dataSource = self; //TableViewの角を丸くする //CALayerでテーブルに影をつけても良いんですが、重いっぽいので今回はUIImageで影をつけたPNGファイルを読み込ませています CALayer* layer = self.tweetTable.layer; layer.masksToBounds = YES; layer.cornerRadius = 5.0; } ... //追加 - (void)loadTimeline{ userNameArray = [[NSMutableArray alloc] initWithCapacity:0]; tweetTextArray = [[NSMutableArray alloc] initWithCapacity:0]; iconDataArray = [[NSMutableArray alloc] initWithCapacity:0]; [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { if (granted) { if (account == nil) { NSArray *accountArray = [accountStore accountsWithAccountType:accountType]; account = [accountArray objectAtIndex:0]; } if (account != nil) { //以下、URLを指定→そこにアクセスする設定をする→アクセスする //検索語を指定する。日本語を検索する場合は、UTF-8でURLエンコードした文字列を渡す //英語で入力しても大丈夫 NSString *searchString = SerchInput.text; //UTF-8でURLエンコード NSString* encodStr = [searchString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //URLを指定 NSString *urlString = [NSString stringWithFormat:@"http://search.twitter.com/search.json?q=%@",encodStr]; //URLWithStringでNSURLのインスタンスを生成 NSURL *url = [NSURL URLWithString:urlString]; //NSURLRequestとurlStringで設定したアドレスにアクセスする設定をする NSURLRequest *request = [NSURLRequest requestWithURL:url]; //NSURLConnectionで実際にアクセスする [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if (error) { NSLog(@"error: %@", [error localizedDescription]); return; } //jsonで解析する NSDictionary *dictionary =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; //resultsにTweetが配列の形で入っている NSArray *tweets = [dictionary objectForKey:@"results"]; //Tweetをひとつずつ取り出して表示する準備をする for (NSDictionary *tweet in tweets) { [tweetTextArray addObject:[tweet objectForKey:@"text"]]; [userNameArray addObject:[tweet objectForKey:@"from_user_name"]]; [iconDataArray addObject:[tweet objectForKey:@"profile_image_url"]]; //ネットワークにアクセスしているマーク [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; } [tweetTable reloadData]; }]; } } }]; } //追加 //ツイートの数だけテーブルになる - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [tweetTextArray count]; } //追加 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //セルのIdentiferを指定 static NSString *cellID = @"tweetCell"; //UITableViewCellクラスのインスタンスを取得 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; //ユーザ名・ツイート・アイコンを表示するラベルやImageViewにタグを設定する。タグを設定することでどれがどれか識別できる。storyboardの「Tag」で設定してから以下に入力する nameLabel = (UILabel*)[cell viewWithTag:1]; textLabel = (UILabel*)[cell viewWithTag:2]; tweetIcon = (UIImageView*)[cell viewWithTag:3]; nameLabel.text = [userNameArray objectAtIndex:indexPath.row]; textLabel.text = [tweetTextArray objectAtIndex:indexPath.row]; textLabel.lineBreakMode = UILineBreakModeWordWrap; textLabel.numberOfLines = 0; textLabel.adjustsFontSizeToFitWidth = YES; NSURL *url = [NSURL URLWithString:[iconDataArray objectAtIndex:indexPath.row]]; NSData *iconData = [NSData dataWithContentsOfURL:url]; tweetIcon.image = [UIImage imageWithData:iconData]; return cell; } //追加 //次のViewにデータを渡す準備 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"mySegue"]) { SecondViewController *secondViewController = [segue destinationViewController]; NSInteger selectedIndex = [[self.tweetTable indexPathForSelectedRow] row]; secondViewController.twStr = [tweetTextArray objectAtIndex:selectedIndex]; secondViewController.usernStr = [userNameArray objectAtIndex:selectedIndex]; } } //TextFieldに入力してからキーボードを閉じるときの処理 - (IBAction)keybordClose:(id)sender { [self loadTimeline]; }