我是一名新手iOS开发人员,正在开发一个倒数计时器为30秒的测验应用程序。在计时器执行过程中,用户可以按“刷新”按钮。当用户按下按钮时,我想使定时器无效(将定时器重置为30秒倒计时),执行视图控制器动画并重新加载相同的视图控制器。我尝试了很多东西,唯一可行的方法是在“刷新”按钮上单击:
CurrenlyLoadedUIViewController1 *currentlyLoadeduiViewController =
[[CurrenlyLoadedUIViewController1 alloc] init];
[currentlyLoadeduiViewController
setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self currentlyLoadeduiViewController animated:YES completion:nil];
我不知道这是否会导致内存泄漏,因为我认为我没有发布当前加载的内存。
请帮忙。
答案 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做这些工作。