识别用于在代码中编辑的情节提要 uibutton
Posted
技术标签:
【中文标题】识别用于在代码中编辑的情节提要 uibutton【英文标题】:identify a storyboard uibutton for editting in code 【发布时间】:2013-06-12 19:57:16 【问题描述】:更新 1
我通过将条件放入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];
除了上面修改过的代码之外,我根据多人的建议为myButton
添加了一个IBOutlet
属性,并将NSTimer
从repeats:NO
更改为repeats:YES
,并删除了调用@987654330 @来自dealCard
。现在系统似乎可以工作了,只是“while”条件self.deal length]>cardNum
的失败没有正确地使else
子句中的NSTimer
无效。
我可以使用一些反馈来说明为什么无效不会被触发。
更新 0
Continuing this answered question,我正在尝试添加“startPause”UIButton 的“Pause”部分。点击按钮后,我希望其标题和操作为“暂停”,然后我希望其标题在“恢复”和“暂停”之间切换。
按钮是在 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];
(我知道我还没有开始代码的“else”部分。)
如何将上面的 myButton
与 Storyboard 中的 startPause
按钮连接起来?
【问题讨论】:
您是否将touch up inside
事件链接到情节提要中的 IBAction ?
您是否尝试以编程方式更改按钮的操作?你有没有把上面的代码在按下按钮时触发?
对不起,我之前没有看到这些 cmets。是的,我确实在情节提要中链接了touch up inside
。是的,我正在尝试以编程方式更改按钮的标题,并且在点击按钮时会触发上述代码。
【参考方案1】:
听起来您在 Storyboard 中的一些连接错误。对于您的 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 也可能有帮助。
【讨论】:
你是说我需要做亚伦在他的回答中提出的第二个建议,并添加一个IBOutlet
以及我已经拥有的IBAction
?我还需要IBAction
中的sender
?谢谢。
IBAction 只是处理......被按下的动作(在你的情况下)。 IBOutlet 允许您操作视图中的对象。如果您只连接 IBAction,您只能响应被触摸的按钮。同样,如果您只连接 IBOutlet,您将拥有一个不响应被触摸的可编程编辑按钮。
是的,我知道 IBAction 处理按钮的按下,而 IBOutlet 将使我能够从 dealCard
方法返回。我还需要sender
来访问按钮的标题吗?我很确定答案是肯定的。那么,在dealCard
结尾处我的命令是什么?是[self startPause: @"myButton"]
,还是什么?
我想我错过了为什么您尝试手动调用 startPause ...每次触摸按钮时都会调用它。要更改按钮的标题,您可以通过 [myButton setTitle:@"New Title" forState:UIControlStateNormal] 使用上面的正确代码。我会更新我的答案,看看我是否能达到你想要完成的目标。
我手动调用startPause
来创建一种连续或重复的“while”循环,其中startPause
方法包含循环继续的条件。【参考方案2】:
startPause
方法的sender
参数应该是你想要的UIButton
,所以你可以直接修改sender
。也就是说,在您的代码 sn-p 中将 myButton
替换为 sender
。
另一种方法是为按钮创建一个IBOutlet
,其优点是,如果您从其他任何地方暂停/恢复,您仍然可以访问该按钮并更新其标题。在您的班级@interface
部分中,您将拥有类似的内容:
@property (nonatomic, strong) IBOutlet UIButton *pauseResumeButton;
然后当您想要引用该按钮时,您可以使用self.pauseResumeButton
或_pauseResumeButton
。
【讨论】:
谢谢。信不信由你,我刚刚尝试将myButton
更改为sender
,但随后我遇到了下一个问题(接下来)。 dealCard
方法曾经有最后一行 [self startPause]
。最后一条指令现在是否需要类似于[self startPause: sender]
?什么是sender
?还是什么?
不,startPause:
方法在您触摸按钮时被调用。您不必在代码中调用它。 sender
是指向调用方法调用的对象的指针,因此在本例中是您触摸的 UIButton
。
但是,我想连续返回到startPause:...
,直到返回被暂停,所以我需要最后一行,但我不知道如何更改它。以上是关于识别用于在代码中编辑的情节提要 uibutton的主要内容,如果未能解决你的问题,请参考以下文章
一起使用笔尖和情节提要:将笔尖的按钮目标/动作连接到情节提要中的控制器