-2

我正在做一个简单的项目来证明我的 iOS 编程技能。我正在尝试做一个程序,您可以在其中输入一个字符串,单击提交,它会在下面创建一个带有您输入的文本的新标签。您提交的字符串越多,彼此下方的标签就越多。我第一次提交后,没有任何反应。如果我第二次提交字符串,我会收到 BAD_EXEC 错误。你能帮帮我吗?

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize infoLabel;
@synthesize field;
@synthesize saveButton;

NSString *labelString = @""; // this string will hold all of my strings together
NSString *separator = @"|<->|"; // this is the separator that will separate strings in labelString

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)dealloc {
    [infoLabel release];
    [field release];
    [saveButton release];
    [super dealloc];
}

- (IBAction)saveButton:(id)sender // when submit button is clicked
{
    if(!([field.text isEqualToString:@""])) // check if anything was entered as the string
    {
        if([labelString isEqualToString:@""]) labelString = field.text; // if nothing is in stored in strings, write the current input
        else // if there already are some strings in there
        {
            NSString *temp = @"";
            temp = [NSString stringWithFormat:@"%@%@%@", labelString, separator, field.text]; // prepare a new labelString to hold all my old strings + new one
            labelString = temp; // replace prepared string with old one
        }

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // saving to database
        [defaults setObject:labelString forKey:@"saveString"];

        NSArray *labelText = [labelString componentsSeparatedByString:separator]; // create array of separated strings
        UILabel *label[[labelText count]]; // create array of labels
        for(int i = 0; i < [labelText count]; i++) // cycle through all labels
        {
            label[i] = [[UILabel alloc] initWithFrame:CGRectMake(0, i * 20 + 20, 320, 20)]; // create a label for each string that will be on a certain position (descending)
            label[i].text = labelText[i]; // set text for labol
        }
    }
}

@end
4

1 回答 1

0

我第一次提交后,没有任何反应。

您创建了您的 UILabel,但您没有将它们添加到您的控制器视图中:

    UILabel *label[[labelText count]]; // create array of labels
    for(int i = 0; i < [labelText count]; i++) // cycle through all labels
    {
        label[i] = [[UILabel alloc] initWithFrame:CGRectMake(0, i * 20 + 20, 320, 20)]; // create a label for each string that will be on a certain position (descending)
        label[i].text = labelText[i]; // set text for labol
        [self.view addSubview:label[i]];
    }

另一方面,我不明白您为什么使用数组来存储标签。似乎没有必要。

至于崩溃,它很可能取决于访问某个已被释放的对象。也就是说:在第一次运行中,你分配了一些对象并弱存储了它的引用;当方法结束时对象被释放;当您重新输入该方法时,您尝试访问该对象 => 崩溃。

这个赋值labelString = temp;对我来说似乎很可疑......尝试用控制器中labelString的属性替换静态全局变量( ):strong@interface

@property(nonatomic,strong) NSString* labelString;

编辑:

我不确定声明labelString为属性是否会修复第二次点击时的崩溃。这只是在黑暗中的一个镜头。

您应该提供有关崩溃的更多信息,以便我能够提供更多帮助。你可以:

  1. 设置一个异常断点(google for it),以便在崩溃后 Xcode 会告诉您崩溃发生在哪一行以及原因是什么;

  2. 或者,只需在其中设置一个断点saveButton并逐步执行,直到崩溃发生;那么您将确切地知道您试图执行哪个语句;

  3. 尝试在您的 Xcode 方案中启用僵尸检测(它的谷歌),因此如果问题是尝试访问已释放的对象,您将获得完整的报告。

希望这可以帮助。

于 2013-10-16T18:02:08.750 回答