2016-12-07 4 views
0

私のiOSアプリケーションでは、ピッカービューとボタンの2つのUIを持っています。NSMutableArrayにNSStringを追加するクラッシュ

私はこのようなNSMutableArrayのと私のピッカービューを初期化:

@interface ViewController() 
{ 
    NSMutableArray *_pickerDataCategory; 
} 
- (void)viewDidLoad 
{ 
    // Initialize Data 
    _pickerDataCategory = [[NSMutableArray alloc] init]; 

    NSMutableArray *array = [NSMutableArray arrayWithObjects: 
          @"cat1", @"cat2", @"cat3", @"cat4", nil ]; 

    _pickerDataCategory = array; 

//First I had initialize like this : NSMutableArray *_pickerDataCategory = [NSMutableArray arrayWithObjects: 
          @"cat1", @"cat2", @"cat3", @"cat4", nil ]; 
} 

それから私は、ユーザーが何かを書くことができますポップアップを表示するボタンがあります。このメソッドの目的は、NSMutableArrayに新しいNSStringオブジェクトを追加することです。

- (IBAction)addNewCategory:(id)sender { 
     __block bool isNotExist = false; 
      UIAlertController * alertController = [UIAlertController alertControllerWithTitle: @"Add new category" 
                        message: @"Please write a new category" 
                      preferredStyle:UIAlertControllerStyleAlert]; 
     [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { 
      textField.placeholder = @"Category"; 
      textField.textColor = [UIColor blueColor]; 
      textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
      textField.borderStyle = UITextBorderStyleRoundedRect; 
     }]; 
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     [alertController dismissViewControllerAnimated:YES completion:nil]; 
    }]; 

    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     NSString *input = alertController.textFields[0].text; 
     //Check if the category exist already 

     for (NSString *category in _pickerDataCategory) 
     { 
      if ([category isEqualToString:input]) 
      { 
       [self popupMessage:@"Category already exists" title:@"Error"]; 
       isNotExist = false; 
       return; 
      }else{ 
       NSString *msg = [@"Category has been added : " stringByAppendingString:input]; 
       [self popupMessage:msg title:@"Ok"]; 
       isNotExist = true; 


       //[_pickerDataCategory addObject:input];//CRASH 
       // [_picker_cateogry reloadAllComponents]; 

      } 
     } 



    }]; 

    [alertController addAction:cancel]; 
    [alertController addAction:ok]; 

    [self presentViewController:alertController animated:YES completion:nil]; 

} 

しかし、NSMutableArrayにTextfield入力を追加するときにクラッシュしました。なぜ私は本当に理解していない。 NSMutableArrayの初期化には注意が必要でした。私はそれについてのインターネット上の任意の情報を探し、私が見つけた2つの情報は、初期化についてか、またはそれが可変配列であり、単純な配列ではない場合のいずれかであった。

さらに、私は[self presentViewController:alertController animated:YES completion:nil];の後にいくつかのコードを追加すると、なぜ実行されないのかわかりません...私はそれについての情報も見つけられませんでした。

なぜクラッシュしたのかわかりません。うまくいかないのですか? ありがとう

+2

あまりにもクラッシュメッセージを追加してください。もう少し簡単に問題を見つけることができます! :) – Rikh

+0

@rikh、はい、忘れました。私は私の投稿を編集する;)ありがとう! – lilouch

+0

配列に 'addObject'を実行しようとしているところにブレークポイントを置き、その値が' nil'ですか? – Rikh

答えて

3

あなたのクラッシュについては、配列を列挙している間に配列を変更しようとしていると考えられます。私はこれらを2つの別々の仕事に分けます。その後、

NSMutableArray *additionalObjects = [[NSMutableArray alloc] init]; 

for (NSString *category in _pickerDataCategory) { 
    if (![category isEqualToString:input]) { 
     [additionalObjects addObject: category]; 
    } 
} 

[_pickerDataCategory addObjectsFromArray: additionalObjects]; 
+0

フランキーはいいですね。 – SM18

+0

ありがとう!私はちょうどあなたが言ったような2つのタスクでそれをやってみました。ユーザーが何かを書いたら、NSStringが格納され、ループの後にNSMutableArrayに追加されます。 なぜ、私はpresentViewControllerの後にいくつかのコードを置くと、それは実行されないのですか? – lilouch

+0

どのようなコードが好きですか? – Frankie

3

のような何か...問題は、あなたが反復しながら、あなたの配列に値を追加しようとしているということです、他のアレイ上のデータを保存し、あなたの_pickerDataCategoryに追加

+0

素敵な観察Marat – SM18

+0

右!私は実際にそれに注意を払っていなかった... – lilouch

3

コードは次のようになります: - 列挙中

- (IBAction)addNewCategory:(id)sender { 
    __block bool isNotExist = false; 
     UIAlertController * alertController = [UIAlertController alertControllerWithTitle: @"Add new category" 
                       message: @"Please write a new category" 
                     preferredStyle:UIAlertControllerStyleAlert]; 
    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { 
     textField.placeholder = @"Category"; 
     textField.textColor = [UIColor blueColor]; 
     textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
     textField.borderStyle = UITextBorderStyleRoundedRect; 
    }]; 
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
    [alertController dismissViewControllerAnimated:YES completion:nil]; 
}]; 

UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
    NSString *input = alertController.textFields[0].text; 
    //Check if the category exist already 
    NSMutableArray * arrTemp = _pickerDataCategory; 
    for (NSString *category in arrTemp) 
    { 
     if ([category isEqualToString:input]) 
     { 
      [self popupMessage:@"Category already exists" title:@"Error"]; 
      isNotExist = false; 
      return; 
     }else{ 
      NSString *msg = [@"Category has been added : " stringByAppendingString:input]; 
      [self popupMessage:msg title:@"Ok"]; 
      isNotExist = true; 


      [_pickerDataCategory addObject:input];//CRASH 
      [_picker_cateogry reloadAllComponents]; 

     } 
    } 



}]; 

[alertController addAction:cancel]; 
[alertController addAction:ok]; 

[self presentViewController:alertController animated:YES completion:nil]; 

    } 
+0

ちょうどあなたの列挙配列を置き換える必要があります – SM18

関連する問題