iphone,了解视图控制器,presentModalViewController

时间:2010-11-19 14:40:52

标签: iphone cocoa-touch uitableview


感谢您的帮助,像往常一样,我正在寻找更多信息......

关于视图控制器,我正在尝试开发具有多个视图的应用程序。

View Controller使用presentModalViewController从View A加载 - 并从那里加载View B - 也工作正常,但我有一些唠叨的问题......

View A中有一个表格,向下钻到View B,然后我可以回到查看一个usig dismissModalViewController,但是一旦回到View A,我就无法访问View A中的表格。

按下视图B时,视图A中的控件/变量会发生什么?调用视图B时调用的dealloc是什么?如果我希望在View B被关闭并且View A重新进入视图时访问控件/变量,我需要做什么?

是否有一些文章可以对此进行教育? 非常感谢您的帮助

重新迭代

  • View Controller从View x
  • 启动页面
  • 查看X加载 - 使用presentModalViewController
  • 在视图中查看A到表中
  • 表在View A的dealloc
  • 中发布
  • 查看B加载正常,工作正常 - 解除视图B控制器返回查看A
  • 此时,我想重新加载View A中的表格,一旦它回到屏幕上

我很确定还有很多其他成员处于这种情况

这是我的代码,一点一滴

startPage - (这是应用程序的主页),带有一个开始按钮,包含

 View Controller -> View

点击开始按钮,加载一个名为ViewA的Viewcontroller(View Controller - > View),代码如下

UIViewController *viewA= [[viewA alloc] initWithNibName:@"viewA" bundle:nil];
viewA.modalTransitionStyle=UIModalTransitionStyleCoverVertical;
[naviControl presentModalViewController:viewA animated:YES];    
[viewA release];   

在ViewA中选择一个表行时,将使用以下代码调用另一个viewcontroller ViewB(View Controller - > View)

UIViewController *viewB= [[viewB alloc] initWithNibName:@"viewB" bundle:nil];
viewB=UIModalTransitionStyleCoverVertical;
[self viewB animated:YES];

ViewB被解雇,VIewA显示代码

[self dismissModalViewControllerAnimated:YES];

此时,对于某些NSLog,当ViewB被关闭时,在ViewA上只调用viewWillAppear,而不是viewDidLoad,如果我尝试在ViewA中的表上重新加载数据,则应用程序会因EXC_BAD_ACCESS而崩溃

由于 Veeru

2 个答案:

答案 0 :(得分:0)

当您将ViewController(VC)B作为模式从VC A呈现时,它不应该释放任何VC A变量(除非可能发送内存警告)。如果要在解除B时重新加载驻留在VC A中的表数据,则可以使用[UITableView reloadData]。您应该从viewDidAppear方法中调用它,因为只要视图返回到屏幕上,就会调用此方法。希望这有帮助!

ps ..用适当的表替换UITableView以重新加载。

答案 1 :(得分:0)

首先,请更正以下声明:

UIViewController *viewA= [[viewA alloc] initWithNibName:@"viewA" bundle:nil];

UIViewController *viewA= [[UIViewController alloc] initWithNibName:@"viewA" bundle:nil];

其次,您需要了解内存管理和视图控制器的流程,例如:

  1. 分配视图控制器时,会在内存中启动保留计数为1的实例
  2. 当您将此视图控制器推送或显示到屏幕上时,其保留计数变为2,因为现在另一个实例导航控制器或视图控制器正在使用您的实例,
  3. 然后你释放它,这使你的视图控制器实例的保留计数再次为1,即减少1,(你必须知道,当保留计数变为0时,只有它将从内存中释放)。
  4. 然后你在这个当前视图控制器的顶部调用了另一个视图控制器,这使得它在后台运行,并且由于你没有明确地保留实例,它会被你添加的导航控制器或视图控制器释放,所以它的保留计数变为0,因此从内存中释放出来。
  5. 因此,当您尝试重新加载tableview时,它会在您尝试使用已释放的实例时为您提供EXC_BAD_ACCESS。
  6. 解决方案:

    1. 如果您尝试在应用程序中使用多个导航屏幕,则应该只使用UINavigationController的pushViewController方法,该方法会保留viewcontroller的实例,直到您明确释放它们为止。

    2. 还要注意使用本地实例或对象实例及其保留计数,跟踪分配和释放,即保留计数,除非您需要,否则不应为0.

    3. 希望这会有所帮助......