【问题标题】:Remove all views in UIView hierarchy and jump to the first view移除 UIView 层次结构中的所有视图并跳转到第一个视图
【发布时间】:2012-06-19 03:48:20
【问题描述】:

我有一个应用程序,它使用

添加了几个子视图到 superview
 [self.view addSubview:subview.view]; 

所有都是不同的视图控制器,并且有自定义的后退按钮来返回主视图/第一个视图。到目前为止没有问题。

在应用程序的某些部分,我必须从屏幕/子视图 4 跳转到第一个视图,在那里我重新创建第一个视图。 (使用 initWithNibName 和 addSubview)。这会增加应用程序的内存。

为了解决这个问题,我想删除所有子视图并返回到第一个视图,因为它已经存在但不可见,而不是再次创建第一个视图。

如何做到这一点?

请帮忙。

提前致谢

【问题讨论】:

  • 嗨@Mobility [[self.view subviews] makeObjectsPerformSelector:@selector(removeFromSuperView)] 就足够了吗?它来自我的脑海,所以把它当作 sudo 代码而不是确切的代码语法。
  • @bennythemink 我想从视图层次结构中删除所有视图,而不仅仅是视图中的子视图。这也适用吗?
  • 嘿@Mobility,如果您使用的是iOS5,您可以遍历所有子视图控制器,将它们从它们的父视图和[subViewController removeFromParentViewController] 中删除。这应该将它们从显示和层次结构中删除
  • 我的应用支持 iOS 4.3 及更高版本。还有其他方法可以实现吗?
  • mmm... 可能会遍历子视图控制器,为每个子视图 removeFromSuperView,然后为 ARC 设置控制器 = nil 或 nil 并释放它,如果使用手动内存管理确保它没有被引用任何其他可能导致崩溃的地方。我认为这是正确的,我的大脑在深夜之后的那一刻被炒了,如果我不正确,社区会告诉我们:)

标签: iphone ipad memory-management uiview uiviewcontroller


【解决方案1】:

您可以声明特定视图的标签值,并根据需要删除所有视图:

*for (UIView *subview in [self.view subviews])

{

if(查看 isKindOfClass:[UIView 类])

{

 if (subview.tag == 101 || subview.tag == 102) 

{

 [subview removeFromSuperview];

}

}

}*

此行下面有一个示例代码:在此代码中,由 xib 创建并调用 btnClicked 方法的按钮“btn”


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    myViewNew = [[UIView alloc] initWithFrame:CGRectMake(50, 40, 150, 150)];
    [myViewNew setTag:102];
    [myViewNew setBackgroundColor:[UIColor redColor]];

    myView = [[UIView alloc] initWithFrame:CGRectMake(50, 40, 150, 150)];
    [myView setTag:101];
    [myView setBackgroundColor:[UIColor blueColor]];

    btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn1 setFrame:CGRectMake(50, 50, 50, 50)];
    btn1.titleLabel.text = @"btn1";
    [myView addSubview:btn1];

    [btn1 addTarget:self action:@selector(btn11Pressed:) forControlEvents:UIControlEventTouchUpInside];

    btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn2 setFrame:CGRectMake(50, 50, 50, 50)];
    btn2.titleLabel.text = @"btn2";
    [myViewNew addSubview:btn2];

    [btn2 addTarget:self action:@selector(btn2Pressed) forControlEvents:UIControlEventTouchUpInside];


}

-(void)btn2Pressed
{
     for (UIView *subview in [self.view subviews])
     {
       if(view isKindOfClass:[UIView class])

       {

        if (subview.tag == 101 || subview.tag == 102) 
        {
            [subview removeFromSuperview];
        }
       }

      }
}

-(void) btn11Pressed:(id)sender
{
    [self.view addSubview:myViewNew];
}

-(IBAction)btnClicked:(id)sender
{
    [self.view addSubview:myView];
}

【讨论】:

    【解决方案2】:

    如果你想删除所有子视图并来第一个视图:

      //here view where you want remove all sub views containing in view
      [[self.view subviews] makeObjectsPerformSelector:@selector(removeFromSuperView)];
    

    这样做以保持一个子视图可见:

        NSArray *allSubViews = [self.view subviews];
        for(int i= 0; [allSubViews count];i++)
        {
          if(i !=0)
          {
              UIView *view = [allSubViews objectAtIndex:i];
              [view removeFromSuperview];
          }
        }
    

    【讨论】:

    • 我刚刚这样做了,这给了我添加到视图上的子视图列表,例如导航栏,按钮,uitableview。但我想要视图层次结构中的所有屏幕并删除所有屏幕并跳回主屏幕
    • 而不是视图使用主屏幕引用,如 NSArray *allSubViews = [主屏幕子视图];
    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多