Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 重新加载当前加载的UIViewController_Objective C_Ios6 - Fatal编程技术网

Objective c 重新加载当前加载的UIViewController

Objective c 重新加载当前加载的UIViewController,objective-c,ios6,Objective C,Ios6,我是一名iOS开发新手,正在开发一款具有30秒倒计时功能的测验应用程序。在定时器执行的中间,用户可以按下刷新按钮。当用户按下按钮时,我希望使计时器无效(将计时器重置回30秒倒计时),执行视图控制器动画并重新加载相同的视图控制器。我尝试了很多方法,唯一有效的方法是在“刷新”按钮上单击: CurrenlyLoadedUIViewController1 *currentlyLoadeduiViewController = [[CurrenlyLoadedUIViewController1 all

我是一名iOS开发新手,正在开发一款具有30秒倒计时功能的测验应用程序。在定时器执行的中间,用户可以按下刷新按钮。当用户按下按钮时,我希望使计时器无效(将计时器重置回30秒倒计时),执行视图控制器动画并重新加载相同的视图控制器。我尝试了很多方法,唯一有效的方法是在“刷新”按钮上单击:

 CurrenlyLoadedUIViewController1 *currentlyLoadeduiViewController = 
 [[CurrenlyLoadedUIViewController1 alloc] init];
 [currentlyLoadeduiViewController 
 setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
 [self currentlyLoadeduiViewController animated:YES completion:nil];
我不知道这是否会导致内存泄漏,因为我认为我不会释放当前加载的内存


请提供帮助。

如果您正在使用ARC,则无需担心释放现有的视图控制器;编译器会帮你做的。如果您没有使用ARC,但使用的是合成属性,那么编译器仍将为您处理内存管理。如果您编写自己的访问器方法并且不使用ARC,只需确保您的访问器方法遵守访问器方法的内存管理规则即可。如果不使用访问器方法,则在使用新值覆盖旧ivar之前释放旧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方法)和视图(包括任何文本字段或其他控件)中的所有值,将视图更新包装到动画中,以便获得良好的淡入淡出效果。但是有很多不同的方法来完成这些工作。

我建议您使用UIView来完成这些工作。

无需重新加载视图控制器。只需重新初始化在viewDidLoad:中初始化的所有相关IVAR。您需要按照您所说的使计时器无效。您可以在连接到“重新加载”按钮的iAction方法中执行所有这些操作。“执行视图控制器动画”是什么意思?谢谢您的评论。如果您看到上面的代码,我会像用户从头开始一样做任何事情。我指的是上面显示的UIViewController SetModAltTransitionStyle。换句话说,当单击“刷新”按钮时,我希望通过完全重新加载UIView控制器而不导致任何内存泄漏来完成与上面相同的操作(就像用户第一次启动测验一样)。这是您第一次实例化和显示视图控制器的代码。如果坚持执行完全相同的操作,则需要通过使显示视图控制器关闭视图控制器、创建新的视图控制器、加载视图控制器并以常规方式显示来对重载操作作出反应。但我不会这么做。我只是将所有相关值设置为其原始值,丢弃并重新启动计时器,可能还会添加一些适当的动画。这很令人放心,我在iOS6中使用ARC,但我没有使用故事板。顺便说一句,我想再次确认这一点。我正在展示一个VIEW控制器,在测验的中间,用户可以改变他的想法,从头开始。此时,我想设置控制器的动画(SetModAltTransitionStyle),使计时器无效,并加载控制器,就像用户第一次这样做一样。我在这里读到一些人说,从当前查看的控制器添加代码来重新加载它是不好的。如何重新加载视图控制器取决于该控制器最初是如何添加的。如果您使用的是导航控制器,则可能需要将其弹出并推送更换件。对象的实例方法将继续运行,即使该方法在该方法的中间被释放,因此您绝对不能访问IVAR,但否则它不会严重。这可能会让代码维护人员感到困惑。最好将逻辑移到父视图控制器或应用程序委托中。我根本不使用导航控制器。只是普通视图控制器。顺便说一句,在刷新按钮内的上面的代码中,如果我添加Disclease代码以关闭当前视图控制器并运行其余代码(如上所述),则会出现BAD_访问错误。如果我把解雇代码注释掉,一切都好。由于您提到使用ARC,运行时将负责释放加载的uiview控制器,因此我认为代码很好。您问题中代码段的最后一行代码看起来乱七八糟。这是代码行:[self-CurrentLoadedUIEWController animated:YES completion:nil];