2013-06-12 35 views
0

更新1识别故事板的UIButton用于编辑工作在代码

予固定的环不通过将条件dealCard而不是在startPause停止的问题。

更新1

更新0

- (IBAction)startPause: (UIButton *)sender{ 
    NSString *buttonTitle = sender.currentTitle; 
    if ([buttonTitle isEqualToString: @"Pause"]) { 

     [self.myButton setTitle:@"Resume" forState:UIControlStateNormal]; 
     [timer invalidate]; 
    } 
    else 
    { 
     [self.myButton setTitle:@"Pause" forState:UIControlStateNormal]; 
     if ([self.deal length]>cardNum) { 
      timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                target:self 
                selector:@selector(dealCard) 
                userInfo:nil 
                repeats:YES]; 
     } 
     else 
      [timer invalidate]; 

    } 
} 

除了上述修改后的代码,我添加一个IBOutlet属性myButton为由多个人的建议,并改变了NSTimerrepeats:YESrepeats:NO,我从dealCard删除了呼叫[self startPause]。现在系统似乎起作用,只是“while”条件self.deal length]>cardNum的故障不能正确地使条款中的NSTimer无效。

我可以使用一些关于为什么invalidate没有被解雇的反馈。

更新0

Continuing this answered question,我想添加一个 “startPause” 的UIButton的 “暂停” 的一部分。点击按钮后,我希望它的标题和动作是“暂停”,并且我希望它的标题在“恢复”和“暂停”之间切换。

这个按钮是在Storyboard中创建的,我想不出如何为按钮创建一个标识符,所以我可以用编程方式改变它。我怀疑我需要增强按钮的IBAction方法以包含“发件人”,但我可能会离开。

目前我有以下未完成的代码。

- (IBAction)startPause: (UIButton *)sender{ 
    NSString *buttonTitle = sender.currentTitle; 
    if ([buttonTitle isEqual: @"Pause"]) { 
    [myButton setTitle:@"Resume" forState:UIControlStateNormal]; //**** myButton is what?  

    if ([self.deal length]>cardNum) { 
     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
               target:self 
               selector:@selector(dealCard) 
               userInfo:nil 
               repeats:NO]; 
    } 
    } 
} 

(我知道我还没有开始代码的“其他”部分)。

如何挂钩myButton上面我在故事板startPause按钮?

+0

您是否将故事板中的'touch up inside'事件链接到您的IBAction? – danypata

+0

你是否试图以编程方式改变按钮的动作?按下按钮后,上面的代码是否会被触发? – Dan

+0

对不起,我以前没有看到这些评论。是的,我确实在故事板中有'连接到内部'。是的,我试图通过编程方式改变按钮的标题,并且点击按钮时触发上面的代码。 – zerowords

回答

1

听起来好像你在故事板中有一些东西接错了。对于你的UIButton(myButton),你应该有两个钩子。.h文件

(1) @property (strong, nonatomic) IBOutlet UIButton *myButton; 
(2) - (IBAction)startPause:(id)sender; 

(1)将允许您将.m文件中的任何地方设置您的按钮标题,特别是在你的myButtonAction事件。 (2)当你将按钮连接到你的.h文件时,你应该选择touchUpInside,这种方式当点击按钮时,myButtonAction将触发事件。

EDIT2(解决的NSTimer)

- (IBAction)startPause: (UIButton *)sender{ 
NSString *buttonTitle = sender.currentTitle; 
if ([buttonTitle isEqualToString: @"Pause"]) { 

    [self.myButton setTitle:@"Resume" forState:UIControlStateNormal]; 
    [timer invalidate]; 
} 
else 
{ 
    [self.myButton setTitle:@"Pause" forState:UIControlStateNormal]; 
    if ([self.deal length]>cardNum) 
    { 
     if (!myTimer.isValid) 
     { 
     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
               target:self 
               selector:@selector(dealCard) 
               userInfo:nil 
               repeats:YES]; 
     } 
     else 
     { 
     //do nothing - timer has been created already 
     } 
    } 
    else 
    { 
     [timer invalidate]; 
    } 
} 
} 

This doc也可能会有帮助。

+0

你是说我需要做Aaron在他的回答中提出的第二个建议,并添加一个'IBOutlet'以及我已经拥有的'IBAction'?我还需要'IBAction'中的'sender'?谢谢。 – zerowords

+0

IBAction只处理...被按下的动作(在你的情况下)。 IBOutlet允许您操作视图中的对象。 如果你只连接IBAction,你只能回应被按下的按钮。同样,如果你只连接IBOutlet,你有一个编程式编辑按钮,不会对被触摸做出响应。 – Dan

+0

是的,我明白IBAction处理按钮的按下,IBOutlet将使我能够从'dealCard'方法返回。我是否也需要'sender'来访问按钮的标题?我很肯定答案是肯定的。所以,在'dealCard'结尾我的命令是什么?是,'[self startPause:@“myButton”]',还是什么? – zerowords

1

startPause方法的sender参数应该是UIButton你想要的,所以你可能可以逃脱直接修改sender。也就是说,在代码片段中用sender代替myButton

另一种方法是,如果您从其他任何地方暂停/继续,仍然可以获取按钮并更新其标题,则该按钮的编号为IBOutlet。在你的类@interface部分,您将有类似:

@property (nonatomic, strong) IBOutlet UIButton *pauseResumeButton; 

,然后当你想引用您可以使用按钮或者self.pauseResumeButton_pauseResumeButton

+0

谢谢。不管你信不信,我只是试着把'myButton'改成'sender',但后来我遇到了下一个问题。 'dealCard'方法的最后一行是'[self startPause]'。现在最后的指令是否需要像'[self startPause:sender]'一样?什么是'发件人'?或者是什么? – zerowords

+0

不,当您触摸按钮时会调用'startPause:'方法。您不必在代码中调用它。 'sender'是一个指向调用方法调用的对象的指针,所以在这种情况下就是你触及的'UIButton'。 – HAS

+0

但是,我想持续返回到'startPause:...'直到退货暂停,所以我需要最后一行,但我不知道如何改变它。 – zerowords