UINavigationController и нажатие openGL UIView = бесконечные циклы - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь отправить 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) продолжает цикл Кроме того, если я снова нажму ViewViewController, первый не останавливается, а новый создается! Я попытался сделать это переменной экземпляра, чтобы была создана только одна, и она имеет тот же эффект. Буду признателен, если кто-нибудь поймет, почему это происходит

sergio Предложение:

-(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]];
    }

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Вы создаете новый GraphViewController каждый раз, когда хотите вставить его в свой стек навигации?Если это так, то на самом деле не имеет значения, как вы обрабатываете создание вашей EAGLView переменной экземпляра, так как вы никогда не будете больше взаимодействовать с этим контроллером представления.

Например:

  1. Пользователь что-то нажимает, новый GraphViewController помещается в стек
  2. Пользователь возвращается, контроллер представления продолжает работать
  3. Вернитесь к 1. и повторите (таким образом создавая SECOND GraphViewController, затем третий, а затем четвертый ... и т. Д.)

Кем вы, вероятно, должны бытьвыполняется сохранение вашего GraphViewController в качестве переменной экземпляра и его создание только один раз.Это гарантирует, что вы, в свою очередь, создаете только один EAGLView.

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

. Затем обязательно release контроллер представления в вашем методе dealloc, если вы собираетесь поддерживатьэто как ивар.

1 голос
/ 01 декабря 2011

Не могли бы вы выполнить свой код:

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

внутри loadView?Я не уверен, почему ваш взгляд ведет себя так, как вы говорите, но это место, где вы должны создать свой интерфейс ... так что это может иметь значение ...

Кроме того, я бы назвал[eagl startAnimation]; только в viewDidLoad ...

Надеюсь, это поможет ...

...