なぜこれが難しいのかわかりませんが、これを機能させることはできません。これが私の基本的な流れです:
サブビューUIButtonを持つサブビューUIViewを持つUIViewControllerがあります。ボタンをクリックすると、TwitterController と呼ばれる NSObject の新しいインスタンスがインスタンス化され、Twitter フィード用の NSURL が作成されてから、制御が TC に渡されて URLConnection が実行され、返されたデータがシリアル化されます。
ViewController の関連コードは次のとおりです (Pruit_Igoe は私です。あまり投稿しませんが、お気軽にフォローしてください : D):
- (void) getTwitter {
//load new manager
twitterManager = [TwitterController new];
[twitterManager showTwitterFeed:vTwitterFeed:self];
NSURL* twitterFeedPath = [NSURL URLWithString: @"http://api.twitter.com/1/statuses/user_timeline.json?screen_name=Pruit_Igoe"];
[twitterManager getTwitterFeed:twitterFeedPath];
//toggle the twitter view
[self toggleView:vTwitterFeed];
[self toggleView:vContactCard];
}
- showTwitterFeed は、ビュー vTwitterFeed (ビューを閉じるボタン、画像など) 内のオブジェクトをダンプします。
- getTwitterFeed は NSURLConnection プロセスを開始します
TwitterController で、Twitter フィードを取得して処理します。
- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection {
//do something with the data!
NSError *e = nil;
//parse the json data
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: receivedData options: NSJSONReadingMutableContainers error: &e];
//dump it into an array
tweetArray = [[NSMutableArray alloc] init];
for(NSDictionary* thisTweetDict in jsonArray) {
NSString* tweet = [thisTweetDict objectForKey:@"text"];
[tweetArray addObject:tweet];
}
}
これはすべて正常に機能し、tweetArray をログに記録し、すべてのテキストがそこにあり、thisTweetDict をログに記録すると、Twitter が送り返すすべての大量のデータがそこにあります。問題は、tweetArray を ViewController に戻したいのですが、その方法がわかりません。
私は次のことをしました:
getTwitterFeed から TweetArray を返そうとしましたが、null として返されました (私の推測では、接続が完了する前にメソッドが配列を返しました)。
UserDefaults に入れようとしましたが、null を取得し続けます (上記と同じ推測ですが、connectionDidFinish に入れても null のままです)
ViewController への参照を TwitterController に渡してから、VC でメソッドを呼び出して配列を渡そうとしましたが、TwitterController では、VC のインスタンスがセレクターを認識しないというエラーが発生しました。(そこにあります、私はトリプルチェックしました)。
これは単純で、密集しているだけだと確信していますが、誰かがこれを手伝ってくれますか?
編集:VCに戻そうとした方法は次のとおりです。
このメソッドを使用してVCをTCに渡します(これはVCにあります)
[twitterManager showTwitterFeed:vTwitterFeed:self];
VC.h には UIViewController* thisViewController がありました
showTwitterFeed の VC.m:
- (void) showTwitterFeed : (UIView* ) theTwitterView : (UIViewController* ) theViewController {
thisViewController = theViewController;
//...other code to build view objects
次に
- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection {
...
for(NSDictionary* thisTweetDict in jsonArray) {
NSString* tweet = [thisTweetDict objectForKey:@"text"];
[tweetArray addObject:tweet];
}
[thisViewController getTwitterFeed:tweetArray]; //<--this would error out saying selector not available
VC.h に戻る
- (void) getTwitterFeed : (NSArray* ) theTwitterFeed;
そしてVC.mで
- (void) getTwitterFeed : (NSArray* ) theTwitterFeed {
NSLog(@"%@", theTwitterFeed);
}