0

このようにopengl UIViewをナビゲーションコントローラーにプッシュしようとしています

GraphViewController *gvc = [[GraphViewController alloc] initWithTicker:[listOfItems objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:gvc animated:YES];
[gvc release];

initWithTicker メソッドは次のようになります

-(id) initWithTicker:(NSString*)ticker{
self = [super initWithNibName:nil bundle:nil];
if (self) {
    self.title = ticker;
    EAGLView *eagl = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    eagl.animationInterval = 1.0 / 60.0;
    [eagl startAnimation];
    self.view = eagl;
}
return self;

}

UINavigationController で前後に移動すると、drawView メソッド (EAGLView 内) がループし続けます。さらに、もう一度 ViewController を押すと、最初のものは止まらず、新しいものが作成されます! これをインスタンス変数にしようとしたので、作成されるのは1つだけで、同じ効果があります。どうしてこうなったのかわかる方いましたらよろしくお願いします

セルジオ提案:

-(id) initWithTicker:(NSString*)ticker{
   self = [super initWithNibName:nil bundle:nil];
   if (self) {
      self.title = ticker;
   }
   return self;
}
// Implement loadView to create a view hierarchy programmatically, without using a nib.

- (void)loadView {
    eagl = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.view = eagl;
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    eagl.animationInterval = 1.0 / 60.0;
    [eagl startAnimation];
    [super viewDidLoad];

}

同じ振る舞い。

--- これは私が drawView のループ問題を修正した方法です --

-(void)viewDidAppear:(BOOL)animated {
    [eagl startAnimation];
    [super viewDidAppear:animated];
}

-(void)viewDidDisappear:(BOOL)animated {
    [eagl stopAnimation];
    [super viewDidDisappear:animated];

}

-- クレイグスのソリューション --

if(graphView == nil){
        graphView = [[GraphViewController alloc] initWithTicker:[listOfItems objectAtIndex:indexPath.row]];
    }else{
        [graphView release];
        graphView = [[GraphViewController alloc] initWithTicker:[listOfItems objectAtIndex:indexPath.row]];
    }
4

2 に答える 2

1

GraphViewControllerナビゲーション スタックにプッシュするたびに新しいものを作成していますか? その場合、インスタンス変数の作成をどのように処理するかは問題ではありませんEAGLView。ビュー コントローラーを再び操作することはないからです。

例えば:

  1. ユーザーが何かをタップすると、新しい GraphViewControllerものがスタックにプッシュされます
  2. ユーザーが戻っても、このView Controllerは引き続き実行されます
  3. 1. に戻って繰り返します (したがって、SECOND GraphViewControllerを作成し、次に 3 番目、4 番目を作成します... など)。

おそらくあなたがすべきことは、あなたGraphViewControllerをインスタンス変数として維持し、それを一度だけ作成することです。これにより、作成するのは 1 つだけになりますEAGLView

if (_graphViewController == nil) {
    _graphViewController = [[GraphViewController alloc] initWithTicker:[listOfItems objectAtIndex:indexPath.row]];
}
[self.navigationController pushViewController:_graphViewController animated:YES];

次に、メソッドを ivar として維持する場合は、必ずメソッドrelease内のビュー コントローラーを使用してください。dealloc

于 2011-11-30T22:06:58.270 に答える
1

あなたのこのコードを実行してみてください:

EAGLView *eagl = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds];
eagl.animationInterval = 1.0 / 60.0;
[eagl startAnimation];
self.view = eagl;

の中にloadView?あなたのビューがあなたの言うように振る舞う理由はわかりませんが、それはあなたがUIを構築することになっている場所です...違いがあるかもしれません...

さらに、私[eagl startAnimation];viewDidLoad...

それが役に立てば幸い...

于 2011-11-30T20:57:14.127 に答える