2012-03-17 3 views
1

Мой код не добавляет элементы в мои наборы.NSMutableSet Не добавлять объект

Мой заголовок файла выглядит следующим образом:

#import <UIKit/UIKit.h> 

@interface NHPSearchViewController : UITableViewController 
//For using the local DB 
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
//texst field where user enters a substance name or a drug name 
@property (weak, nonatomic) IBOutlet UITextField *substanceTextField; 

//An array for Drug Names, and another array for NHPs 
@property (strong, nonatomic) NSMutableSet *drugList; 
@property (strong, nonatomic) NSMutableSet *NHPList; 
//Contains both drugList and NHP list as one array for the data to be shown for the user. 
@property (strong, nonatomic) NSMutableSet *usersList; 

@end 

Мой .m файл:

@interface NHPSearchViewController() 
- (BOOL) checkAndAddToList: (NSString *) substance; 
@end 

@implementation NHPSearchViewController 

@synthesize managedObjectContext; 
@synthesize substanceTextField; 
@synthesize drugList, NHPList, usersList; 

//"Private" helper methods 

-(BOOL) checkAndAddToList:(NSString *)substance{ 
    // Set up a predicate for testing if the data exists in the table 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"name == %@", substance];  

    //Run the query to see if the substance is in the Substances Table. 
    NSMutableArray *results =[NSMutableArray array]; 
    results = [CoreDataHelper searchObjectsForEntity:@"Substances" withPredicate:pred andSortKey:nil andSortAscending:NO andContext:self.managedObjectContext]; 

     if ([results count] > 0){ 
     //Found the substance return YES 
      Substances *sub = [results objectAtIndex:0];   
      NSLog(@"Did find a result with name:%@ and class_name as:%@ ",[sub name], [sub class_name]); 

      //add the name to the appropriate lists. 
      if([[sub class_name] isEqualToString:@"NHP"]){ 
       NSLog(@"NHP was found adding it to the nhp list"); 
       [NHPList addObject:[sub name]]; //THIS is not working 
       NSLog(@"NHP count after adding %i", [NHPList count]); 
      }else if ([[sub class_name] isEqualToString:@"Drugs"]){ 
       NSLog(@"Drug was found adding it to the drug list"); 
       [drugList addObject:[sub name]]; //THIS is also not working 
      } 

      //add the name to our list in the view 
      [usersList addObject:[sub name]]; //This is also not working 

      return YES; 
    }else{ 
     // 
     return YES; 

    } 
return NO; 
} 

логарифмического выхода:

[4187: fb03] значение Тестирование substanceTextField: Omega 3-6-9 [4187: fb03] Найти результат с именем: Omega 3-6-9 и class_name as: NHP [4187: fb03 ] NHP было найдено, добавив его в список NHP [4187: fb03] NHP счет после добавления 0 [4187: fb03] NHP Список: 0 DrugList: 0 UserList: 0

+0

Try: '[self.NHPList AddObject: [суб name]]; 'и также убедитесь, что self.NHPList не ноль. – lnafziger

+0

Это не сработало – user597608

+0

Вы проверили вторую часть моего комментария? Является ли NHPList нил? (Это тот же вопрос, который задает @bandejapaisa) – lnafziger

ответ

7

В какой-то момент перед использованием набора вам необходимо создать новый NSMutableSet.

Чтобы упростить процесс, вы можете использовать что-то вроде следующего, чтобы автоматически назначить новый изменяемый набор, когда вы попросите его использовать в первый раз.

- (NSMutableSet *)NHPList { 
    if (NHPList == nil) { 
     NHPList = [[NSMutableSet alloc] init]; 
    } 
    return NHPList; 
} 

Вы также должны освободить память, как правило, в методе viewDidUnload, установив NHPList в nil.

Если это единственное место, которое вы установили данные, вы также можете просто изменить эту строку:

[NHPList addObject:[sub name]]; 

к:

if (self.NHPList == nil) { 
    self.NHPList = [[NSMutableSet alloc] init]; 
} 
[self.NHPList addObject:[sub name]]; 
+0

Вам нужно будет сделать то же самое для drugList и usersList. – lnafziger

1

Вы инициализирован NHPList?

+0

Я новичок в Objective-C, но разве это не то, что делает синтез? Если мне действительно нужно инициализировать его, как бы я это сделал? и мне также нужно будет выпустить память вручную? – user597608

+1

Нет, синтез создает для вас сеттеры и геттеры (которые содержат некоторый код для управления памятью). Вы используете ARC - память будет обрабатываться для вас при создании и инициализации, и вам не нужно будет освобождать память в dealloc. См. Ответ @Inafziger для кода, используемого для создания переменной NHPList. Вероятно, хорошая идея, чтобы просмотреть образец кода Apple и прочитать руководство по программированию Objective-C. – bandejapaisa