在我的Iphone应用程序中,我试图从一个表视图控制器导航到下一个表视图控制器。我面临的问题是我必须使用http请求获取数据,然后在用户选择单元格时解析此数据。我能够获取和解析数据,但视图控制器不等待解析数据并显示下一个视图控制器(它是空的)。如何克服这个问题。
indexSelected = [NSString stringWithFormat: @"%d",[indexPath row] ];
[[MySingletonClass sharedMySingleton] doAnAuthenticatedAPIFetch_Subscriber_Detail : indexSelected];
SubscribersDetailViews2 *viewController = [[SubscribersDetailViews2 alloc] initWithNibName:@"SubscribersDetailViews2" bundle:nil];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];
答案 0 :(得分:2)
这就是你要做的:
indexSelected = [NSString stringWithFormat: @"%d",[indexPath row] ];
SubscribersDetailViews2 *viewController = [[SubscribersDetailViews2 alloc] initWithNibName:@"SubscribersDetailViews2" bundle:nil];
[[MySingletonClass sharedMySingleton] doAnAuthenticatedAPIFetch_Subscriber_Detail:indexSelected delegate:self];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];
您定义了视图控制器符合的协议,并且在完成数据的提取和解析时,您可以调用委托上的方法,让视图控制器知道数据已准备好显示。
如果您需要有关如何执行此操作的更多信息,请发表评论。
编辑:以下是如何声明和使用协议。我打算尽量保持简单。我不确定我是否喜欢你的命名约定,但我仍然会在这个例子中使用它。
让我们来看看代码。这就是你声明协议的方式:
@protocol MySingletonClassDelegate <NSObject>
@optional
- (void)didDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithData:(NSArray *)data;
- (void)failedToDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithError:(NSError *)error;
@end
同样,我不太喜欢命名惯例。您不应该在objective-c方法名称中使用下划线。
协议应在声明MySingletonClass.h
之前在MySingletonClass
中定义。
我在协议中声明了两个方法,一个用于传递数据,另一个用于在失败时传递错误,以便您可以通知用户它失败了。
要使用该协议,您需要以下内容:
@interface SubscribersDetailViews2 : UITableViewController <MySingletonClassDelegate>
您还需要实现协议中声明的方法,但我会将该实现留给您。
由于数据的提取似乎已经在后台发生,我认为我不需要解释如何做到这一点。要记住的一件重要事情是,您希望在主线程上执行委托方法。这是执行此操作的代码:
- (void)doAnAuthenticatedAPIFetch_Subscriber_Detail:(NSUInteger)index delegate:id<MySingletonClassDelegate>delegate {
// Fetching data in background
if (successful) {
[self performSelectorOnMainThread:@selector(didDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithData:) withObject:data waitUntilDone:NO];
} else {
[self performSelectorOnMainThread:@selector(failedToDoAnAuthenticatedAPIFetch_Subscriber_Detail_WithError:) withObject:error waitUntilDone:NO];
}
}
要明确// Fetching data in background
应该由您的代码替换。我假设你的代码产生了我使用的变量(NSArray * data,NSError * error,BOOL success)。
就是这样,如果你需要澄清任何让我知道的事情。
答案 1 :(得分:1)
有很多选择:
简而言之,没有任何点击方式可以做到这一点,但只要您告诉用户发生了什么,就可以即时下载数据。