识别用于在代码中编辑的情节提要 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 属性,并将NSTimerrepeats: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的主要内容,如果未能解决你的问题,请参考以下文章

一起使用笔尖和情节提要:将笔尖的按钮目标/动作连接到情节提要中的控制器

故事板中的 UITableView 部分空白

在情节提要中编辑 UITableViewController 并在定义 VC 类之后

Xcode 5,禁用情节提要[重复]

在情节提要中,您可以只为一台设备编辑布局吗?

pushViewController 似乎不适用于情节提要和 QLPreviewController