按钮按下方法位置

时间:2010-10-25 12:27:19

标签: iphone objective-c xcode

这可能很难解释。

基本上我的项目有以下结构:

我有一个控制其他对象(节点)和(弧)的对象(图形)。

一切都工作得很好,但是我发现需要在我的节点对象中添加按钮。这也正常工作,我有一个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 :(得分:0)

您可以拥有一些存储当前所选节点的对象。如果用户按下按钮,则会向该“主”对象发送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...
}

您的'图表'可能是您的主对象......

替代方案:您甚至可以在侦听“停用”通知的每个节点中拥有一个NSNotification观察器。然后,如果有人单击按钮,您将执行的操作就是发送该通知(节点通过停用来监听和响应),然后激活当前节点。为了确保这两个事件不会干扰,您可以发送对发送节点的引用,如果sender == receiver,则不会停用。