2011-03-16 170 views
0

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

這是你做什麼:

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的聲明之前,協議應該在MySingletonClass.h中定義。

我在協議中聲明瞭兩個方法,一個用於傳遞數據,另一個用於在失敗時傳遞錯誤,以便通知用戶它失敗了。

要使用你需要以下協議:

@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成功)。

就是這樣,如果你需要澄清任何事情讓我知道。

+0

嗨,埃裏克感謝您的早期答覆可以plz指導我如何申報和使用協議。 – 2011-03-16 10:03:42

+0

我當然可以。我會盡快找到時間。希望那會很快。 – 2011-03-16 10:10:11

+0

您是否在'MySingletonClass'中將'doAnAuthenticatedAPIFetch_Subscriber_Detail:'更改爲'doAnAuthenticatedAPIFetch_Subscriber_Detail:delegate:'? – 2011-03-17 10:02:13

1

有許多的選擇:

  1. 緩存的數據,即,利用它的完整副本的iOS設備上(可能是不實際的課程)
  2. 展示插頁屏幕說:「裝載」,然後移動到當數據下載
  3. 有「真正的」屏幕,有效,您的表格有兩個不同的數據源。第一個是你現在的那個。第二個將是一個單元格說「正在加載...」

總之,沒有點和點擊方式這樣做,但沒有問題,只要你告訴你的用戶什麼是發生。

+0

第三種選擇是我在回答中提出的,我忘記提及加載單元或將其視爲理所當然。也許我應該更新我的答案... – 2011-03-16 10:07:37

相關問題