まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

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];
}