Расположение нажатием кнопки - PullRequest
0 голосов
/ 25 октября 2010

Это, вероятно, будет сложно объяснить.

В основном у меня есть следующая структура в моем проекте:

У меня есть объект (график), который управляет другими объектами (узлами) и (дугами).

Все работает отлично, но я нашел необходимость добавлять кнопки к моим объектам узла. Это тоже работает нормально, у меня есть вывод NSLog, позволяющий мне узнать, какой узел был выбран и т. Д. Моя проблема, однако, я хочу, чтобы только один узел был выбран за один раз. Код инициализации для моих узловых объектов выглядит следующим образом:

- (id) initNodeWithData:(NSString *) _label: (int) _xpos: (int) _ypos 
{
    if(self = [super init])
    {
    //other variable inits here...

    [self setButton: [UIButton buttonWithType:UIButtonTypeCustom]];

    [button setImage:[UIImage imageNamed:@"node.png"]
            forState:UIControlStateNormal];

    [button setImage:[UIImage imageNamed:@"node.png"]
            forState:UIControlStateHighlighted];

    [button setImage:[UIImage imageNamed:@"nodeSelected.png"]
            forState:UIControlStateSelected];

    [button setImage:[UIImage imageNamed:@"nodeSelected.png"]
            forState:(UIControlStateHighlighted|UIControlStateSelected)];

    [button addTarget:self 
               action:@selector(buttonPressed) 
     forControlEvents:UIControlEventTouchUpInside];

}
return self;
}

- (void)buttonPressed
{
    NSLog(@"%@ Pressed", label);

    if(button.selected == YES) button.selected = NO;
    else if(button.selected == NO) button.selected = YES;
}

Поскольку мои объекты узлов независимы друг от друга, я не могу (я не думаю, что смогу в любом случае) проверить, были ли выбраны какие-либо другие узлы, прежде чем продолжить выбор.

В идеале я хочу что-то вроде:

- (void)buttonPressed
{
    //Check to see if other nodes are selected
    //If not, button.selected = yes
    //else clear other buttons
    //then select current button
}

Но я думаю, что мне нужен этот код в моем классе viewController, где находится весь мой другой код, и я не знаю, как это сделать, потому что я предполагаю, что все это выходит за рамки.

Извините, что это не очень понятно, это трудно объяснить!

1 Ответ

0 голосов
/ 25 октября 2010

У вас может быть какой-то объект, который хранит выбранный в данный момент узел.Если пользователь нажимает кнопку, вы отправляете NSNotification этому «главному» объекту.

MasterObject.h

Node *currentlyActiveNode;

MasterObject.m

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(activateNode:) name:kNotificationActivateNode object:nil];

...

- (void)activateNode:(NSNotification *)notification {
   Node *requestingNode = (Node *)[notification.object];
   if (requestingNode != currentlyActiveNode) {
      [currentlyActiveNode deactivate];
      currentlyActiveNode = requestingNode;
      [requestingNode activate];
   }

}

Node.m

- (void)requestActivation {
    [[NSNotificationCenter defaultCenter] postNotificationName:name:kNotificationActivateNode object:self];
}

- (void)activate {
   //Whatever...
}
- (void)deactivate {
   //Whatever...
}

Ваш «граф» может быть вашим мастеромobject ...

Альтернатива: Вы можете даже просто иметь наблюдателя NSNotification в каждом узле, который прослушивает "деактивированное" уведомление.Тогда, если вы нажмете кнопку, вы просто отправите это уведомление (которое узлы слушают и на что реагируют путем деактивации), а затем активируете текущий узел.Чтобы эти два события не мешали, вы можете отправить ссылку на отправляющий узел и не деактивировать, если отправитель == получатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...