2011-08-29 121 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和关联的数据。