0

サブビューをビューに追加すると、次のようになるという印象を受けました。

UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped];
sitesel.view.frame = CGRectMake(0,0,100,100);
[self.left addSubview:sitesel.view];
[sitesel release];

しかし、サイトセル (コントローラー) を解放するべきではないようです。だから私はビューを解放する必要がありますか、私はこれを少し前に釘付けにしたものを保持していましたが、それはずれています。(そして、TableView を使用するには、UITableViewController をサブクラス化する必要がありますよね?)

(self.left は、nib に追加された self.view のサブビューです)

4

1 に答える 1

1

addSubviewビューを保持しますが、それは問題ではありません。あなたの問題は、ビューのコントローラーが少し後になくなることです。

それはあなたの仕事ではないので、ビューを解放するべきではありません。あなたはそれを作成しませんでした、あなたはそれに触れませんでした。ほっといて。

物事を動かし続けるためには、有効なコントローラーに接続したままにしておく必要があります。したがって、コントローラーを解放するのではなく、手元に置いておく必要があります。コントローラーを解放する前に@property(retain) UITableViewController *siteController;、andのようなプロパティを追加します。self.siteController = sitesel;このようにして、すべてがメモリに残ります。

PS: きれいにするために、おそらく sitesel のアクセサーのビューを変更する必要があります。常にコントローラーに沿って行き来するようにするためです。コントローラーを設定するだけで、メソッドはさらに短くなります。

追加:そのセッターはそのように見える可能性があり、コントローラーと透過的に更新されるビューのみを設定する必要があります。

- (void)setSiteselController:(UITableViewController *)ctrl {
  if (_sitesel)
    [_sitesel.view removeFromSuperview];

  [_sitesel autorelease];
  _sitesel = [ctrl retain];

  if (_sitesel) {
    _sitesel.view.frame = CGRectMake(0,0,100,100);
    [self.left addSubview: _sitesel.view];
  }
}

元のコードは、このよりクリーンなバージョンに縮小されます。

UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle: UITableViewStyleGrouped];
self.siteselController = sitesel;
[sitesel release];

PPS: UITableView を機能させるにはコントローラーが必要です。それははるかに簡単です!

于 2010-08-30T13:28:36.260 に答える