2011-09-28 63 views
1

我是一名Web開發人員,負責構建內部使用的基本iOS應用程序。應用程序中的許多功能需要身份驗證,並且我已經成功構建了登錄視圖/控制器,它調用webservice,驗證用戶等等。iOS視圖「重定向」

我目前可以通過點擊按鈕來加載「LoginView」對用戶進行身份驗證,然後使用已建立的憑據將視圖從視圖堆棧中退出,然後返回到原始視圖。這些都不是我的問題。

現在我正在尋找相當於做一個'重定向',就像我在爲網絡開發一樣。我需要從需要身份驗證的應用程序中的任何函數加載LoginView,並在成功時加載一些其他視圖,這些視圖將被「傳入」(在Web上,我將提供重定向Url)到LoginView。我覺得這是一件簡單的事情,而且必須始終做到,但無法找到一個很好的例子或解釋。我敢肯定,我的顯而易見的新事物阻止了我尋找正確的術語。

希望有人能破譯我的窮人,但最好的嘗試解釋我在找什麼。先謝謝你。

回答

0

這是代表的完美工作。在您的登錄視圖控制器接口(請注意我在寫這離我的頭頂,所以有可能有幾個錯字/遺漏分號等:

@protocol LoginControlDelegate <NSObject> 
- (void)loginDidSucceed:(BOOL)success 
@end 

@interface ... 
{ 
    ... 
} 

@property (nonatomic, assign) id<LoginControlDelegate> delegate; 

@end 

,然後在實現文件,一旦你已經確定,web服務已經響應登錄請求,您可以撥打:

if (self.delegate != nil) 
    {self.delegate loginDidSucceed:<YES/NO depending on the webservice response>] 

所以每次您創建的登錄視圖控制器的一個實例時,您可以指定「父」視圖控制器爲委託,然後通過執行方法loginDidSucceed:

符合
LoginViewController *vc = [[LoginViewController alloc] init....]; 
vc.delegate = self; 
[self presentModalViewController:vc animated:YES]; 
[vc release]; 

而且loginDidSucceed方法:

- (void)loginDidSucceed:(BOOL)success 
{ 
    if (success) 
    // Logged in successfully, push the appropriate view 
    } else { 
    // Login failed... 
} 
+0

這一切都正常工作,我只會建議,如果你已經有一些類似於WebRequestManager的調用你的Web服務的調用(創建連接,管理錯誤,返回數據),而不用擔心登錄委託,而是在那裏管理該登錄視圖,將所有視圖與需要這種委託的類型隔離。 這樣,您的視圖只是通過管理器發起請求,並期望數據被返回,無論是否需要登錄。 – EricLeaf

+0

ASSIGN NOT RETAIN! –

+0

@XcodeDev是我的壞,大時間,並修復:) – Rog

0

移動開發與網絡開發不同。一般來說,應用程序將有一次用戶登錄,然後永遠不會獲得(至少只有當應用程序打開時,如Mint)。如果可能,請考慮更改應用程序的設計以適應移動設計慣例,而不是從網絡世界中借用。這是一個不同的球賽,你的用戶會欣賞它。

這就是說,我可能會通過構建一個基於蘋果的UIAlertView設計的自定義UIView來攻擊這個問題。給它一個委託協議,當它和一個經過驗證的用戶一起返回時,你調用它的控制器可以使用委託方法對自己進行適當的修改。

+0

我明白這不是像網絡和規則已經改變可以這麼說。我是Mint的愛好者,非常熟悉所使用的示例,但在這種情況下,我正在嘗試完成的業務需求。該應用程序有許多功能,但只有一個子集需要身份驗證。許多功能需要匿名用戶可用,所以你可以看到困境。很大一部分用戶羣永遠不會使用需要驗證的功能(甚至可能沒有帳戶),所以我不想強迫它提前。 – jaySF

+0

我會仔細看看基於UIAlertView的建議,如果它看起來對我有用,請回過頭來標記您的答案。 – jaySF

+0

並不意味着演講,我知道業務需求以某種方式妨礙優雅的設計:)讓我知道它是如何結果。 Rog的帖子對於讓你開始製作委託協議非常有用。 –

0

什麼@Rog發佈都將正常工作的規定。我只會建議,如果你已經有一些類似於WebRequestManager的東西,它將調用分派給你的Web服務(創建連接,管理錯誤,返回數據),而不用擔心委派登錄,而是管理該登錄視圖經理,把你所有的觀點都從需要這種委託(這成爲一個維護頭痛)中分離出來。

這種方式您的意見只是通過經理髮起請求,只是期望數據被返回,無論是否需要登錄。值得注意的是,應用程序甚至不需要(或可能不知道)哪些請求需要登錄,只是發現該請求是來自服務器的響應。在此時您可以啓動登錄視圖,獲取憑據,然後使用有效憑證重新啓動請求。

此時我會保留憑據,至少對於當前運行會話,因此任何未來的請求都不需要其他登錄。

2

我使用的一種模式是將成功處理程序塊傳遞給身份驗證視圖控制器。

這比代表系統的優勢在於,您可以將其設置爲執行任何操作,包括移至任何視圖控制器,而無需修改每個視圖控制器以匹配委託協議。

例如,成功驗證後我可能想要做的一件事是將視圖控制器堆棧彈出回主菜單,或繼續處理已在進行的Web服務請求。代表系統並沒有真正考慮到這一點,而代碼塊更靈活,因爲你可以傳入任何你想要的代碼。