【问题标题】:Passing a value from NSObject class back to UIViewController将 NSObject 类中的值传递回 UIViewController
【发布时间】:2012-06-11 12:00:52
【问题描述】:

我不知道为什么这会如此困难,但我无法让它发挥作用。这是我的基本流程:

我有一个带有子视图 UIView 的 UIViewController,它本身有一个子视图 UIButton。单击该按钮会实例化一个名为 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

在 VC.m 中的 showTwitterFeed:

- (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);
}

【问题讨论】:

  • 你能把你试图把 tweetArray 放在视图控制器中的代码贴出来吗?及其定义?
  • 好的,稍等几秒,我会在...

标签: ios objective-c cocoa-touch methods uiviewcontroller


【解决方案1】:

你不能从getTwitterFeed返回它,因为connectionDidFinishLoading还没有被调用。

您需要做的是在您的TwitterController 中设置一个协议,并使您的ViewController 成为delegatedelegate

然后当connectionDidFinishLoading 出现并且你保存了推特信息时,你可以将函数调用回你的delegateViewController)。

TwitterController 协议中创建一个名为twitterDataReceived:(NSDictionary *)tweetDict 的函数,并在connectionDidFinishLoading 函数中调用它:[self.delegate twitterDataReceived:thisTweetDict]; 或者如果您只想发送文本,则将其设置为twitterTextReceived:(NSString *)theTweet 并调用[self.delegate twitterTextReceived:tweet];或使用twitterArrayReceived:(NSArray *)tweetArray[self.delegate twitterArrayReceived:tweetArray]; 之类的数组,或者您想发回的任何内容。

如果您不熟悉如何设置协议和委托,有很多问题可以帮助您解决问题,例如:objective-c protocol delegates

【讨论】:

    【解决方案2】:

    您得到一个无法识别的选择器,因为 thisViewController 的类型为 UIViewController,它没有定义此方法(尽管从您发布的代码中看不到它,但我绝对确定这是这种情况,因为您会收到编译错误当分配thisViewController = theViewControllertheViewController 类型为UIViewController)

    所以将 thisViewController 类型更改为您自定义的视图控制器,并更改

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

    成为:

    (void) showTwitterFeed : (UIView* ) theTwitterView : (&lt;Your custom controller type&gt;* ) theViewController

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 2020-10-23
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多