重新加载当前加载的UIViewController

时间:2013-07-27 17:21:59

标签: objective-c ios6

我是一名新手iOS开发人员,正在开发一个倒数计时器为30秒的测验应用程序。在计时器执行过程中,用户可以按“刷新”按钮。当用户按下按钮时,我想使定时器无效(将定时器重置为30秒倒计时),执行视图控制器动画并重新加载相同的视图控制器。我尝试了很多东西,唯一可行的方法是在“刷新”按钮上单击:

 CurrenlyLoadedUIViewController1 *currentlyLoadeduiViewController = 
 [[CurrenlyLoadedUIViewController1 alloc] init];
 [currentlyLoadeduiViewController 
 setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
 [self currentlyLoadeduiViewController animated:YES completion:nil];

我不知道这是否会导致内存泄漏,因为我认为我没有发布当前加载的内存。

请帮忙。

2 个答案:

答案 0 :(得分:0)

如果您正在使用ARC,则无需担心释放现有的视图控制器;编译器会为你做。如果您不使用ARC,但使用的是合成属性,则编译器仍将为您处理内存管理。如果您编写自己的访问器方法但未使用ARC,请确保您的访问器方法遵守访问器方法的内存管理规则。如果您没有使用访问器方法,则在使用新值覆盖之前释放旧的ivar。

编辑: 至于替换视图控制器,您需要仔细区分视图控制器及其视图。

视图控制器不需要重新加载,尽管没问题。但是最初加载它的同一个对象也应该是重新加载它的对象。始终考虑对象,责任和关系(对象所有权)。

通常你会这样做:

- (void)resetCurrentViewController {
    UIViewController *old = self.currentViewController;
    UIView *oldView = old.view
    UIView *superview = [oldView superview];
    UIViewController *new = [[MyViewController alloc] initWithNibName:nil bundle:nil];
    UIView *newView = new.view;
    [UIView transitionWithView:superview
       duration:0.2
       options:UIViewAnimationOptionTransitionFlipFromLeft
       animations:^{ [oldView removeFromSuperview]; [containerView addSubview:newView]; }
       completion:^{ self.currentViewController = new; }];
}

这是使用替换变量名称在编辑框中编写的,而不是使用实际代码编写的。基础知识是“自我”(无论是)“拥有”“currentViewController”,并替换为新的副本当前副本,而在同一时间换旧观点的新的,哪一个假设将有新的价值观。

但正如另一位评论者所说,这似乎有点矫枉过正。您可以交替重置视图控制器中的所有值(在视图控制器中实现-reset方法来执行此操作)和视图(包括任何文本字段或其他控件),将视图更新包装在动画中,这样您就可以获得一个好处褪色。但是有很多不同的方法可以做到这一点。

答案 1 :(得分:0)

我建议你使用UIView做这些工作。