web-dev-qa-db-ja.com

Objective-Cでサブビューを削除する方法は?

プログラムによって、UIButtonとUITextViewをサブビューとしてビューに追加しました。

notesDescriptionView = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,460)];
notesDescriptionView.backgroundColor = [UIColor redColor];
[self.view addSubview:notesDescriptionView];

textView = [[UITextView alloc] initWithFrame:CGRectMake(0,0,320,420)]; 
[self.view addSubview:textView]; 
printf("\n description  button \n");

button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button
  addTarget:self action:@selector(cancel:)
  forControlEvents:UIControlEventTouchDown];
[button setTitle:@"OK" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 420.0, 160.0, 40.0);
[self.view addSubview:button];

ボタンがクリックされたときにすべてのサブビューを削除する必要があります。

私が試してみました:

[self.view removeFromSuperView]

しかし、それは機能していません。

26
mac

[self.view removeFromSuperView]上記のスニペットと同じクラスのメソッドから。

その場合[self.view removeFromSuperView]は自身のスーパービューからself.viewを削除しますが、自分自身はサブビューを削除するビューのオブジェクトです。オブジェクトのすべてのサブビューを削除する場合は、代わりにこれを行う必要があります。

[notesDescriptionView removeFromSuperview];
[button.view removeFromSuperview];
[textView removeFromSuperview];

おそらく、これらのサブビューをNSArrayに保存し、その配列の各要素に対してremoveFromSuperviewを呼び出してその配列をループ処理する必要があります。

21
Frank Shearar

ビューに追加したすべてのサブビューを削除するには

次のコードを使用

for (UIView *view in [self.view subviews]) 
{
    [view removeFromSuperview];
}
58
mac

Objective-C APIには、UIViewからすべてのサブビューを削除する簡単な方法がないことにいつも驚いています。 (Flash APIにはありますが、結局はかなり必要になります。)

とにかく、これは私がそのために使用する小さなヘルパーメソッドです。

- (void)removeAllSubviewsFromUIView:(UIView *)parentView
{
  for (id child in [parentView subviews])
  {
    if ([child isMemberOfClass:[UIView class]])
    {
      [child removeFromSuperview];
    }
  }
}

編集:ここでよりエレガントな解決策を見つけました: self.viewからすべてのサブビューを削除する最良の方法は何ですか?

これを次のように使用しています:

  // Make sure the background and foreground views are empty:
  [self.backgroundContentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
  [self.foregroundContentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

私はそれが好きです。

8