在View控制器之间导航?

时间:2011-03-16 09:09:45

标签: objective-c ios4 tableview

在我的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];

2 个答案:

答案 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)

有很多选择:

  1. 缓存数据,即在iOS设备上获取完整数据(当然可能不实用)
  2. 显示插页式屏幕,显示“正在加载”,然后在下载数据时移至“真实”屏幕
  3. 有效地为您的表提供两种不同的数据源。第一个是你现在的。第二个是单个单元格,说“正在加载......”
  4. 简而言之,没有任何点击方式可以做到这一点,但只要您告诉用户发生了什么,就可以即时下载数据。