2011-08-27 48 views
0

我有以下代碼:iPhone簡單問題:如何從主類調用方法?

 LoginViewController *lvc = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; 
[self presentModalViewController:lvc animated:false]; 
[lvc release]; 

這是從我MainViewController調用。

現在,當LoginViewController將被解僱(當然,這隻會發生在登錄是正確的)我必須調用我的MainViewController中的方法來加載我的應用程序的初始數據。

我讀了很多關於委託並嘗試過,但沒有得到它的工作。 有人可以幫我嗎?

(如果可能,請用幾行代碼) 歡迎任何幫助!

回答

4

我讀了很多關於委託並嘗試過,但沒有得到它上班。

你真的試過了什麼?您的LoginViewController必須定義一個簡單的委託協議,並且您的MainViewController必須符合它。

所有你需要做的就是增加一些像這樣的LoginViewController.h以上@interface:

@protocol LoginViewControllerDelegate 

- (void)loginViewControllerDidFinish; 

@end 

它聲明一個方法的協議。然後@interface和@end之間補充一點:

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

這意味着你的登錄視圖控制器將有一個屬性叫做委託,它將指向任何類的一個實例(這就是ID裝置)符合它的委託協議(介於<和>之間的東西)。不要忘記在.m文件裏面輸入@synthesize delegate;

現在你需要做的是內部MainViewController.h添加到@interface一行:

@interface MainViewController : UIViewController <LoginViewControllerDelegate> 

告訴你MainViewController類符合本LoginViewControllerDelegate委託協議的編譯器。現在在MainViewController.m中實現- (void)loginViewControllerDidFinish;方法,並在呈現登錄視圖控制器模式地將其委託給自己(login.delegate = self;)之前。當你登錄的視圖控制器內部完成,您關閉之前,調用委託方法在您委託:

[self.delegate loginViewControllerDidFinish]; 

就是這樣。還有其他問題嗎?

+0

謝謝,我做了最多的事情,問題是,我無法設置委託=自我,因爲我使用Three20導航器來調用LoginViewController。有任何想法嗎? – Kovu

+0

你是指Three20導航儀的實例嗎?如果是這種情況,你的界面看起來像'@interface MainViewController:UIViewController'。只要將''添加到該行的末尾即可。 –

1

嘗試這種情況:

1)推登錄視圖時,在MainViewController在方法viewWillAppear中設置一些標誌MainViewController

2)檢查該標誌爲1)。如果已設置,則加載初始數據並取消設置標誌。否則,請按LoginView。

1

你有一個UIApplicationDelegate,它應該有一個指向MainViewController的實例變量。通過屬性公開此實例變量,說mainViewController(您UIApplicationDelegate),然後就可以像這樣訪問:

[(MyUIApplicationDelegate *)[[UIApplication sharedApplication] delegate] mainViewController]