0

なぜこれが難しいのかわかりませんが、これを機能させることはできません。これが私の基本的な流れです:

サブビュー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);
}
4

2 に答える 2

0

はまだ呼び出されていないgetTwitterFeedため、から返すことはできません。connectionDidFinishLoading

あなたがする必要があるのは、あなたのプロトコルをセットアップし、TwitterControllerあなたViewControllerdelegateTwitterController.

次に、connectionDidFinishLoading発生してtwitter情報を保存すると、関数をdelegate( ViewController)に戻すことができます。

プロトコルtwitterDataReceived:(NSDictionary *)tweetDictのようなものと呼ばれる関数を作成し、関数で呼び出します。 または、テキストを送信したいだけの場合は、それを作成してandのような配列を呼び出すか使用するか、または送り返したいものを何でも呼び出します。TwitterControllerconnectionDidFinishLoading[self.delegate twitterDataReceived:thisTweetDict];twitterTextReceived:(NSString *)theTweet[self.delegate twitterTextReceived:tweet];twitterArrayReceived:(NSArray *)tweetArray[self.delegate twitterArrayReceived:tweetArray];

プロトコルとデリゲートの設定に慣れていない場合は、次のように役立つ質問がたくさんあります: Objective-C プロトコル デリゲート

于 2012-06-07T13:23:11.823 に答える
0

thisViewControllerこのメソッドが定義されていないタイプであるため、認識されないセレクターを取得しUIViewControllerます(投稿したコードからは見えませんが、割り当て時にコンパイルエラーが発生し thisViewController = theViewControllertheViewControllerタイプがUIViewController)

タイプをカスタマイズしたView Controllerに変更thisViewControllerし、署名も変更します

(void) showTwitterFeed : (UIView* ) theTwitterView : (UIViewController* ) theViewController

することが :

(void) showTwitterFeed : (UIView* ) theTwitterView : (<Your custom controller type>* ) theViewController

于 2012-06-07T13:40:26.443 に答える