如何重置或重启UIViewController的根视图到其原始状态?

时间:2014-01-27 06:29:03

标签: ios objective-c uiviewcontroller

我是iOS开发的新手。我有一个非常简单的UIViewController,在视图中有两个按钮。我允许用户编辑UI组件或从一个地方拖放到另一个地方。现在我想实现重置功能,允许用户将UI重置为原始阶段,丢弃所有更改。

正如几篇文章中提到的尝试过的setNeedsDisplay,但看起来它的实现方式并不正确。我有什么选择?

e.g。 在Android世界中,您可以完成当前的Activity(等效于UIViewController)并重新启动self以实现原始状态。是否可以在iOS中执行类似的操作。

- (IBAction)resetButtonClicked:(id)sender {
    // Now I want discard all the changes on the screen 
    // On some button click or specific action from user.

    // Tried calling setNeedsDisplay as pointed in few others answers but somehow 
    // setNeedsDisplay does not reload my ViewController.
    // [self.view setNeedsDisplay];
  }

4 个答案:

答案 0 :(得分:1)

我做了类似的事情。我做的是:

1)为每个帧ui控件创建本地CGRect变量,即CGRect originalFrame1;

2)获取每个ui控件的原始帧位置并将它们存储在viewDidLoad上,即originalFrame1 = _frame1.frame;

3)在resetButtonClicked上将其设置回原始位置_frame1.frame = originalFrame1;

答案 1 :(得分:0)

我可以想到两个选择:

1-保存初始状态的位置,当用户点击重置按钮时,只需将这些按钮置于其初始状态。

2-OR(这样做的奇怪方式),你可以初始化你所在的同一个控制器并从它自己出来,这应该以某种方式接近你的android方法。你将在初始状态下获得相同的控制器(如果你没有解雇第一个,你应该)

希望有所帮助:)

答案 2 :(得分:0)

你可以在主视图中保存所有子视图(按钮,标签......)的位置。

self.view.subview它将返回包含所有元素的数组:)

当你想要休息时,只需从阵列中获取每个子视图的旧位置。

NSArray *arrayOfView = [view subviews]; 
//also:
NSMutableArray *mutableArrayOfView = [[view subviews] mutableCopy];

for (UIImageView *imageView in imageViewArray) //uiimageview or whatever your subview //is you can check by using isKindofClass. `if ([view isKindOfClass:[UIImageView class]])` 
{
    //let's set frame for image view before adding to
    [myimageView setFrame:imageview.frame];//or something like that 

}

答案 3 :(得分:0)

EVery应用程序将有一个 keyWindow 对象,您应该为其指定一些要显示的viewController。

window.rootViewController = [[UIViewController alloc] init];

让我们说你的控制器类是 CustomViewController

所以,在你的app委托中, didFinishLaunchingWithOptions ,你会写

self.window.rootViewController = [[CustomViewController alloc] init];

点击重置按钮时调用的功能如下,

-(void)reset{
   // reset the view with default
   self.view.window.rootViewController = [[CustomViewController alloc] init];

}

如果您遵循上面的代码,它将不会有任何内存泄漏,因为当您再次设置rootViewController时,旧的将丢失并从内存中删除。