基于标签的多功能UIButton更改UILabel的线程中断

Posted

技术标签:

【中文标题】基于标签的多功能UIButton更改UILabel的线程中断【英文标题】:Thread Break on Tag-Based Multi-Function UIButton changing UILabel 【发布时间】:2013-12-17 02:25:35 【问题描述】:

我有一个 UIButton,它有多种方法。正如您将在我的代码中看到的那样,每次按下 UIButton 时,它都会更改其标签,从而让我让它每次都做不同的事情(所以第一次做事情 A,第二次做事情 B,等等)。我确实发现由于某种原因 iPhone 一次会执行两种这样的方法,所以我在每个真实的方法之间添加了一个无用的方法。这工作得很好,但由于某种原因它刚刚停止工作,我不知道为什么。现在它在第一次按下 UIButton 时就出现了线程中断。任何帮助表示赞赏。

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController  <UITextViewDelegate> 
    IBOutlet UITextView *textEnterView;
    IBOutlet UILabel *promptLabel;
    IBOutlet UIButton *nextButton;

    NSString *topicString;
    NSString *firstString;
    NSString *firstSubString;
    NSString *secondString;
    NSString *secondSubString;
    NSString *thirdString;
    NSString *thirdSubString;
    NSString *conclusionString;

@property (nonatomic, retain) UITextView *textEnterView;
@property (nonatomic, retain) UILabel *promptLabel;
@property (nonatomic, retain) UIButton *nextButton;

@property (nonatomic, retain) NSString *topicString;
@property (nonatomic, retain) NSString *firstString;
@property (nonatomic, retain) NSString *firstSubString;
@property (nonatomic, retain) NSString *secondString;
@property (nonatomic, retain) NSString *secondSubString;
@property (nonatomic, retain) NSString *thirdString;
@property (nonatomic, retain) NSString *thirdSubString;
@property (nonatomic, retain) NSString *conclusionString;


- (IBAction) next:(id)sender;
@end

ViewController.m:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize textEnterView, promptLabel, nextButton, firstSubString, firstString, secondSubString, secondString, thirdSubString, thirdString, conclusionString, topicString;

- (void)viewDidLoad

    UIButton *button = nextButton;
    [button setTag:1234];
    [button addTarget:self action:@selector(next:) forControlEvents:UIControlEventTouchUpInside];
    textEnterView.delegate = self;
    promptLabel.text = @"First Label";
    textEnterView.text = @" ";
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


- (IBAction) next:(UIButton *)sender 
    if(nextButton.tag==1234) 
    promptLabel.text = @"Second Label";
        [nextButton setTag:2];
        topicString = textEnterView.text;
        //FAKE METHOD
    
    else if (nextButton.tag==2) 
        promptLabel.text = @"Third Label";
        textEnterView.text = @" ";
        [nextButton setTag:3];
        //REAL METHOD
    
    else if (nextButton.tag==3) 
        promptLabel.text = @"Fourth Label";
        firstString = textEnterView.text;
        [nextButton setTag:4];
        //FAKE METHOD
    
    else if (nextButton.tag==4) 
        promptLabel.text = @"Fifth Label";
        textEnterView.text = @" ";
        [nextButton setTag:5];
        //REAL METHOD
    

    else if (nextButton.tag==5) 
        promptLabel.text = @"Sixth Label";
        firstSubString = textEnterView.text;
        [nextButton setTag:6];
        //FAKE METHOD
    
    else if (nextButton.tag==6) 
        promptLabel.text = @"Seventh Label";
        textEnterView.text = @" ";
        [nextButton setTag:7];
        //REAL METHOD
    
    else if (nextButton.tag==7) 
        promptLabel.text = @"Eighth Label";
        secondString = textEnterView.text;
        [nextButton setTag:8];
        //FAKE METHOD
    
    else if (nextButton.tag==8) 
        promptLabel.text = @"Ninth Label";
        textEnterView.text = @" ";
        [nextButton setTag:9];
    //REAL METHOD
    
    else if (nextButton.tag==9) 
        promptLabel.text = @"Tenth Label";
        secondSubString = textEnterView.text;
        [nextButton setTag:10];
    //FAKE METHOD
    
    else if (nextButton.tag==10) 
        promptLabel.text = @"Eleventh Label";
        textEnterView.text = @" ";
        [nextButton setTag:11];
    //REAL METHOD
    
    else if (nextButton.tag==11) 
        promptLabel.text = @"Twelfth Label";
        thirdString = textEnterView.text;
        [nextButton setTag:12];
    //FAKE METHOD
    
    else if (nextButton.tag==12) 
        promptLabel.text = @"Thirteenth Label";
        textEnterView.text = @" ";
        [nextButton setTag:13];
    //REAL METHOD
    
    else if (nextButton.tag==13) 
        promptLabel.text = @"Fourteenth Label";
        thirdSubString = textEnterView.text;
        [nextButton setTag:14];
    //FAKE METHOD
    
    else if (nextButton.tag==14) 
        promptLabel.text = @"Fifteenth Label";
        textEnterView.text = @" ";
        [nextButton setTag:15];
    //REAL METHOD
    
    else if (nextButton.tag==15) 
        promptLabel.text = @"Sixteenth Label";
        conclusionString = textEnterView.text;
        [nextButton setTag:16];
    
    else if (nextButton.tag==16) 
        promptLabel.text = @"Seventeenth Label";
        textEnterView.text = @" ";
        [nextButton setTag:17];
    
    else if (nextButton.tag==17) 
        [nextButton setTag:18];
    
    else 
        promptLabel.text = @"Eighteenth Label";
        [nextButton setTag:1234];
    



- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

很明显,这些标签除了“第十八个标签”之外还说了些什么,但如果我说明为什么这么说,我就会放弃这个应用程序的想法。但是,所有其余代码都与应用程序中的完全相同。感谢您的帮助!

【问题讨论】:

我会先剔除假货。您可以简单地在修饰事件中更改标签。 我想我确实在修饰事件中更改了标签...我不明白为什么它一次执行两种方法,但如果你能详细说明一下,我会很乐意删除假货你是什​​么意思。我应该在哪里设置标签?你的意思是我将标签设置为 1234 最初应该发生在方法中,但在子方法之外(或任何你想调用的方法)而不是在 viewDidLoad 中?如果是这样,为什么这会让 iPhone/iPod 开始一次使用一个子方法而不是两个?谢谢! 因为您正在调用标签1234 或任何标签的方法,并且您在按钮仍然按下时更改标签,因此下一个方法被触发。我想如果你真的按住按钮足够长的时间,就会触发许多方法。如果在释放按钮时将标记的更改移动到动作触发中,则不应进行双重方法调用。堆满了假的方法调用,草率…… 虽然这很有意义,但我只是尝试在我的 iPod Touch 5 上按住 UIButton 几次约 20 秒,它的行为仍然完全一样,所以我不认为这解释了这个问题......我仍然很困惑。不过感谢您的帮助!另外,如果您有答案,请将其发布为答案,而不是评论,以便我将您标记为正确并为您的麻烦提供代表点。 【参考方案1】:

我在我的 iPod Touch 上运行了它,它运行得非常好——但只有在没有插入计算机的情况下。我认为 Xcode 以某种方式搞砸了它,因为该应用程序在 iPod 未连接时工作,但在连接 iPod 并且计算机正在记录结果时不能工作。然而,重要的是它可以独立工作,所以虽然错误的原因仍然未知,但它已经解决了,因此并不重要。但是,如果有人想出一个真正解释该问题的解决方案,我当然会将其作为该问题的官方“答案”。可能问题在于它是为错误的构建设置构建的,例如 Arm__(其中 __ 是错误的字母 - 不确定哪些是正确的,哪些不是)。无论如何,这个问题似乎得到了奇怪的解决。

【讨论】:

以上是关于基于标签的多功能UIButton更改UILabel的线程中断的主要内容,如果未能解决你的问题,请参考以下文章

使用 UiButton 反复更改 UILabel 文本

使用 UILabel 和 UIButton 显示用户标签

从 UILabel 或 UITextField 更改 UIButton 的标题

在 UILabel 之后制作 UIButton Wrap

UILabel 和 UIButton - 截断标签而不是按钮

UIButton 在 UILabel text+iPhone 之间