0

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

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

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

请帮忙。

4

2 回答 2

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; }];
}

这是在编辑框中编写的,而不是来自真实代码,使用替代变量名。基础是“self”(无论是什么)“拥有”“currentViewController”,并用新副本替换当前副本,同时将旧视图换成新视图,假设将具有新的价值观。

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

于 2013-07-27T17:57:01.653 回答
0

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

于 2013-07-27T18:18:58.787 回答