代码之家  ›  专栏  ›  技术社区  ›  Veeru

iPhone,了解视图控制器,PresentModalView控制器

  •  0
  • Veeru  · 技术社区  · 14 年前


    谢谢你的帮助,像往常一样,我正在寻找更多的信息…

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

    视图控制器从视图A加载使用presentmodalview控制器-和从那里加载视图B-也可以很好地工作,但我有一些烦人的问题…

    视图A中有一个表,它向下钻取到视图B,我可以向后移动以查看USig DismissModalView控制器,但一旦返回视图A,我就无法访问视图A中的表。

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

    有没有什么文章可以说明这一点? 任何帮助都非常感谢

    重新迭代

    • 视图控制器从视图X启动页面
    • View X Loads-使用PresentModalView Controller将带有表的视图A加载到视图中
    • 表在视图A的dealLoc中释放
    • 视图B加载正常,工作正常-取消视图B控制器返回视图A
    • 此时,我想在视图A中重新加载表,一旦它回到屏幕上

    我很肯定还有很多其他的会员也在这种情况下

    这是我的代码,零碎的

    start page-(这是应用程序的主页),带有start按钮,包含

     View Controller -> View
    

    单击“开始”按钮时,正在加载名为VIEWA(视图控制器->视图)的视图控制器,代码如下

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

    在VIEWA中选择表格行时,将使用以下代码调用另一个VIEWController VIEWB(视图控制器->视图)

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

    VIEWB被取消,VIEWA显示为代码

    [self dismissModalViewControllerAnimated:YES];
    

    此时,对于某些nslogs,当viewb被取消时,只在viewa上调用viewwill,而不是viewdidload;如果我尝试在viewa中的表上重新加载数据,应用程序将崩溃,并具有exc_bad_访问权限。

    谢谢 小精灵

    2 回复  |  直到 14 年前
        1
  •  0
  •   Sanniv    14 年前

    首先,请更正以下声明:

    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-u访问权。

    解决方案:

    1. 如果您试图在应用程序中使用多个导航屏幕,则只应使用uinavigationcontroller的pushviewcontroller方法,该方法保留viewcontroller实例,直到显式释放它们。

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

    希望这会有帮助…

        2
  •  0
  •   DerekH    14 年前

    当您从vc a将viewcontroller(vc)b呈现为模式时,它不应该释放任何vc a变量(除非可能发送内存警告)。如果要在关闭b时重新加载位于vc a中的表数据,则可以使用[uitableview reload data]。您应该从viewdidAppear方法调用它,因为每当视图返回屏幕时都会调用它。希望这有帮助!

    PS。将UITableView替换为要重新加载的适当表。