2011-08-29 180 views
1

所以我有兩個視圖A和B.A是一個配置文件視圖,B是一個登錄視圖。在登錄查看使用重新加載視圖iPhone

LoginViewController *lvc = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]]; //make new instance of LoginViewController 
     [self presentModalViewController:lvc animated:NO]; //present the LoginViewController 
     [lvc release]; 

在viewDidLoad方法一負荷B,如果登錄成功,認爲被刪除

[self dismissModalViewControllerAnimated:YES]; 

在登錄視圖,它下載了一些數據,我想顯示在配置文件視圖上。我將如何將數據發送到配置文件視圖並將其顯示在xib中。我相信配置文件視圖已經顯示,但只是隱藏。

回答

1

這是一個基本的「兩個班級之間的溝通」問題。有很多方法可以做到這一點,但這裏有三個。我只爲代表團編寫了示例代碼(因爲我認爲這可能是您的情況中的最佳選擇),但是如果您需要通知或KVO的示例,請告知我。

委託代理在A類中實現委派或回調方法。對於小類層次結構,委派最適合。如果A類是唯一能夠加載B的類,而A是唯一關心B中發生的事情的類,那麼委派是移動數據的最簡單方法。實現起來很簡單,它很容易理解,並且類之間有明確的關係。

// Class A 
- (void)displayLoginViewController { 
    LoginViewController *lvc = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]]; 
    lvc.delegate = self; 
    [self presentModalViewController:lvc animated:NO]; //present the LoginViewController 
    [lvc release]; 
} 

- (void)loginViewControllerWasSuccessfull:(LoginViewController *)loginViewController { 
    // Do whatever you need to do here 
    [self dismissModalViewControllerAnimated:YES]; 

} 

在登錄視圖控制器做這樣的事情在頭:

@property (assign) NSObject delegate; // declared assign so you don't have circular references 

...這在執行:

- (void)didLogin { 
    [self.delegate loginViewControllerWasSuccessfull:self]; 
} 

通知 A類將註冊偵聽用於登錄通知。 B類將發佈登錄通知。如果關心登錄的類是分佈式的,那麼通知是最好的。即有許多關注登錄事件的類,它們可能不一定與正在執行登錄的類有直接關係。

鍵值觀察志願是最好的,如果你不特別在意登錄事件,您所關心的更改數據。如果您使用核心數據,您將擁有一些管理數據的類,可能是NSManagedObject。 A類將觀察其感興趣的任何財產的變化。當您完成下載數據時,您的LoginViewController將更新該數據類別。 A類將被通知數據已經改變。無論您決定使用哪種解決方案,最終都會選擇「A類關心什麼?」。 A類是否需要知道B類成功登錄?使用委派。 A類是否需要在某個地方知道某個類已登錄?使用通知。 A類不關心登錄,只需要知道數據是否發生了變化?使用KVO。

0

您可以在登錄視圖中將下載的數據存儲在委託文件中。並在viewWillAppear方法的配置文件視圖使用代理的數據....

+0

即使它不起作用,因爲在登錄控制器之前首先調用配置文件視圖控制器。製作ProfileViewController * profileController會更容易;然後執行諸如profileController.username = username;但它不會顯示,因爲視圖已經繪製完成。 – mintuz

+0

是啊真的......但是當你提出登錄頁面並解僱後它profileView的viewWillAppear將被稱爲..試試吧...... – Maulik

0

因爲你必須創建變量並設置它的屬性在.h和.m文件.than你可以在登錄屏幕設置此變量值和它會綜合到配置文件屏幕。

另一種方式 您必須在appDalegate中創建變量。在登錄屏幕中設置appDalegate值並在配置文件屏幕中使用此值

+0

viewWillAppear總是打電話,只要你改變你的觀點儘管如此,你可以強制觀看viewWillAppear methos [self dismissmodelviewcontrollerAnimated: yes viewWillAppear:yes] – Droid

1

您在下載數據而不是ViewDidLoad後載入視圖A.

1

當你點擊登錄按鈕然後下載數據並顯示它。 如果你的viewWillAppear沒有調用,然後創建nsnotification中心對象,併發布它時,你想調用你的視圖willAppear method.and然後刪除此通知。

0

如果我理解正確,那麼您正在嘗試執行相當於Android的意圖。因此,我建議使用iOS的NSNotificationCenter併發送NSNotifications和關聯的數據。