2016-12-07 4 views
0

В моем приложении iOS у меня есть пользовательский интерфейс с двумя вещами: представление выбора и кнопка.Добавить NSString в NSMutableArray crash

инициализирует мой взгляд сборщика с 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 ]; 
} 

Тогда у меня есть кнопка, которая отображать всплывающую где пользователь может написать что-то. Цель этого метода: добавить новый объект NSString в мой NSMutableArray.

- (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. Я действительно не понимаю, почему. Я был осторожен в инициализации моего NSMutableArray. Я искал любую информацию в Интернете об этом, и две найденные мной сведения касались либо инициализации, либо либо, если это изменчивый массив, а не простой массив.

Кроме того, я не понимаю, почему, если я добавлю код после [self presentViewController:alertController animated:YES completion:nil];, он не выполнен ... Я также не нашел никакой информации об этом.

Не могли бы вы помочь мне разобраться, почему он разбился и не работает? Thank

+2

Не могли бы вы добавить сообщение об аварии, которое вы получили? Помогло бы найти проблему немного проще! :) – Rikh

+0

@rikh, Да забыл. Я просто редактирую свой пост;) спасибо! – lilouch

+0

Положите точку останова, где вы пытаетесь «добавить объект» в массив, и проверьте, является ли значение «nil»? – Rikh

ответ

3

Что касается вашего сбоя, возможно, это связано с тем, что вы пытаетесь изменить массив, пока вы его перечисляете. Я разбил бы их на две отдельные задачи.

Что-то вроде ...

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

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

[_pickerDataCategory addObjectsFromArray: additionalObjects]; 
+0

nice Frankie хорошая работа – SM18

+0

Thank! Я просто попытался сделать это в двух задачах, как вы сказали. Как только пользователь что-то написал, NSString сохраняется, а затем после цикла я добавляю его в NSMutableArray. И знаете ли вы, почему, если я поместил код после текущего элемента управления, он не выполнен? – lilouch

+0

Как какой код? – Frankie

3

Проблема заключается в том, что вы пытаетесь добавить значения в массив, а итерация, сохраните данные на другой массив, а затем добавить его в _pickerDataCategory

+0

хорошее наблюдение Марат – SM18

+0

Справа! Я не обратил внимания на это на самом деле ... – lilouch

3

The код будет выглядеть следующим образом: - при перечислении

- (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

просто нужно заменить ваш перечислимый массив как temp – SM18