2013-10-16 71 views
-2

我正在做一個簡單的項目來證明我的iOS編程技巧。我正在嘗試執行一個程序,在該程序中輸入一個字符串,單擊「提交」,它將在下面用您輸入的文本創建一個新標籤。您提交的字符串越多,您在對方下的標籤就越多。第一次提交後,沒有任何反應。如果我第二次提交一個字符串,我得到一個BAD_EXEC錯誤。你能幫我解決嗎?簡單的數據庫(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 
+0

它在哪裏崩潰?至少發佈堆棧跟蹤。還要注意,'NSUserDefaults'不是一個數據庫,真的不應該用於存儲應用程序的多於配置狀態;上次打開的位置,用戶選項等等。 – bbum

+0

https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOS/chapters/Introduction.html –

+0

http://i.imgur.com/AaMUBjD.png – Sam

回答

0

After I submit it the first time, nothing happens.

您創建的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;似乎高度懷疑到我...嘗試用strong屬性來代替靜態全局變量labelString在你的控制器(@interface):

@property(nonatomic,strong) NSString* labelString; 

編輯:

我不是當然,如果聲明labelString屬性將修復第二次敲擊的崩潰。這只是在黑暗中拍攝而已。

你應該提供更多關於崩潰的信息,以便我能夠幫助更多。你可以:

  1. 設置異常斷點(谷歌),這樣的大跌後的Xcode會告訴你在哪條線路的事故發生出於什麼原因;

  2. 或者,只需在saveButton中設置一個斷點,然後一步一步走直到發生崩潰;那麼你將確切知道你想要執行的語句;

  3. 嘗試在您的Xcode方案中啓用殭屍檢測(谷歌它),以防萬一這個問題試圖訪問一個已經釋放的對象,你會得到完整的報告。

希望這會有所幫助。

+0

感謝您的快速回復。我嘗試了[self.view ...],但它給了我這個錯誤:實例方法'-addSubView:'找不到。 (返回類型默認爲'id')另外,即時通訊不知道你要我把強大的財產。我只有幾個屬性,這些是我的按鈕,標籤和文本框。他們寫在.h文件中。我在.m文件中聲明瞭我的字符串。 – Sam

+0

從您的評論中,您說錯誤是'-addSubView:'找不到。'如果你直接複製錯誤,那就是你的問題,方法是'addSubview:UIView'而不是'addSubView:UIView' @ user2874028 –

+0

@ user2874028:'addSubview'拼寫爲小寫'v' ...至於屬性,如果你願意,你可以在你的.h文件中聲明它,就像其他人一樣。另見我的編輯... – sergio