我有以下代码:
LoginViewController *lvc = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self presentModalViewController:lvc animated:false];
[lvc release];
从我的MainViewController调用。
现在,当LoginViewController被解散时(当然这只会在登录正确时发生)我必须在我的MainViewController中调用一个方法来加载我的应用程序的初始数据。
我阅读了很多关于委托的内容并尝试过,但是没有让它发挥作用。 有人可以帮帮我吗?
(如果可能的话,请用几行代码) 欢迎任何帮助!
答案 0 :(得分:4)
我阅读了很多关于委托的内容并尝试过,但是没有让它发挥作用。
你真的尝试过什么?您的LoginViewController必须定义一个简单的委托协议,您的MainViewController必须符合它。
您需要做的就是在@interface上面的LoginViewController.h中添加类似的内容:
@protocol LoginViewControllerDelegate
- (void)loginViewControllerDidFinish;
@end
使用一种方法声明协议。然后在@interface和@end:
之间添加它@property (nonatomic, assign) id <LoginViewControllerDelegate> delegate;
这意味着您的登录视图控制器将具有一个名为delegate的属性,该属性将指向符合其委托协议(&lt;和&gt;之间的东西)的任何类的实例(即id的含义)。不要忘记.m文件中的@synthesize delegate;
。
现在您需要做的是在MainViewController.h中添加到@interface行,如下所示:
@interface MainViewController : UIViewController <LoginViewControllerDelegate>
告诉编译器您的MainViewController类符合此LoginViewControllerDelegate委托协议。现在在MainViewController.m中实现- (void)loginViewControllerDidFinish;
方法,并在呈现登录视图控制器之前以模态方式将其委托设置为self(login.delegate = self;
)。在登录视图控制器中完成后,在解除它之前,请在您的委托上调用委托方法:
[self.delegate loginViewControllerDidFinish];
就是这样。还有其他问题吗?
答案 1 :(得分:1)
试试这个:
1)当按下登录视图时,在MainViewController中设置一些标志
2)在MainViewController中的方法 viewWillAppear 中检查来自1)的那个标志。如果已设置,则加载初始数据和取消设置标志。否则按下LoginView。
答案 2 :(得分:1)
你有一个UIApplicationDelegate,它应该有一个指向MainViewController的实例变量。通过属性公开此实例变量,比如mainViewController
(在您的UIApplicationDelegate上),然后您可以像这样访问它:
[(MyUIApplicationDelegate *)[[UIApplication sharedApplication] delegate] mainViewController]