UIButton 从 Core Data 增加一个数组,从另一个类完成

Posted

技术标签:

【中文标题】UIButton 从 Core Data 增加一个数组,从另一个类完成【英文标题】:UIButton that increments an array from Core Data, done from another class 【发布时间】:2017-04-22 19:23:45 【问题描述】:

我有一个按钮,当它被按下时,它应该增加一,结果会在文本字段中显示一个新字符串。我有一个核心数据管理器类,其中包含一个应该检索我的数组的方法,但是每当我按下按钮时,应用程序就会崩溃。我留下一个错误说明...

"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UsefulCodes rangeOfCharacterFromSet:]: unrecognized selector sent to instance 0x6000000a3f60'"

“UsefulCodes”是我的 Core Data 实体的名称,“codeName”和“codeDescription”分别是我的 presetList 和 codeDescArray 的属性。我认为它不起作用,因为我试图将核心数据对象放入文本字​​段,但数组中的所有对象都是字符串,我如何让它成功传递到文本字段?我将在下面发布相关代码。

来自 CoreDataManager -

@implementation CoreDataManager

+(CoreDataManager*)sharedInstance 
    static CoreDataManager *sharedObject;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        sharedObject = [[CoreDataManager alloc] init];
    );

    return sharedObject;



-(void)storeListFirstTime 

    //http://morsecode.scphillips.com/morse.html
    NSArray* presetList = [NSArray arrayWithObjects:@"AS",
                                                   @"BCNU",
                                                   @"CL",
                                                   @"CT",
                                                   @"CUL",
                                                   @"K",
                                                   @"QSL",
                                                   @"QSL?",
                                                   @"QRX?",
                                                   @"QRV",
                                                   @"QRV?",
                                                   @"QTH",
                                                   @"QTH?",
                                                   @"R",
                                                   @"SN",
                                                   @"SOS",
                                                   @"73",
                                                   @"88",
                                                   nil];


    NSArray* codeDescArray = [NSArray arrayWithObjects:@"Wait",
                                                      @"Be seeing You",
                                                      @"Going off air",
                                                      @"Start Copying",
                                                      @"See you later",
                                                      @"Over",
                                                      @"I acknowledge receipt",
                                                      @"Do you acknowledge",
                                                      @"Should I wait",
                                                      @"Ready to copy",
                                                      @"Are you ready to copy?",
                                                      @"My location is ...",
                                                      @"What is your location?",
                                                      @"Roger",
                                                      @"Understood",
                                                      @"Distress message",
                                                      @"Best regards",
                                                      @"Love and kisses",
                                                      nil];

    //Saves the initial list of items
    for(int i = 0; i < presetList.count; i++) 
        NSManagedObjectContext *context = [self context];
        UsefulCodes *codeObj = [NSEntityDescription insertNewObjectForEntityForName:@"UsefulCodes"
                                                             inManagedObjectContext:context];
        codeObj.codeName = [presetList objectAtIndex:i];
        codeObj.codeDescription = [codeDescArray objectAtIndex:i];

        NSLog(@"CODEOBJ: %@", codeObj);
    

    [self saveContext];


//THIS IS THE METHOD I AM CALLING FOR MY BUTTON METHOD
-(NSArray*)fetchAllRecords 

    NSManagedObjectContext *context = [self context]; //this context is conected to persistant container
    NSError *error = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UsefulCodes"];
    NSArray *records = [context executeFetchRequest:request
                                              error:&error];

    if(error == nil && records.count > 0) 
        return [records copy];
    
    else 
        //Handle error by returning new array
        return [NSArray new];
    

上面的代码只是设置了我硬编码到我的数组中的初始值(我只对从 presetList 数组中获取值以显示在文本字段中感兴趣)以及容纳我添加到的任何新代码和描述任何数组。现在这是我的“MainViewController”中负责循环遍历我的数组的方法。

在头文件中我声明了一个名为 num 的属性。

@property(nonatomic)int num;

这是实现文件中的方法。

- (void)getQuickMorseCode 

    NSArray *array = [[CoreDataManager sharedInstance] fetchAllRecords];

    if(_num == 0 || _num > 0) 
        if(_num >= array.count)
            _num = 0;
        
        //GETTING THE SPECIFIC INDEX OF THE ARRAY, THIS IS WHERE THE PROBLEM LIES
        self.morseTextfield.text = array[_num];
        [self convertInput:self.morseTextfield.text];
        [self buttonAppear];
        _num++;
    

我的目标是在我的 CoreDataManager 文件中显示 presetList 数组中的字符串,但我无法将其传递到我的文本字段中。欢迎对我的问题提出任何见解。

【问题讨论】:

【参考方案1】:

您的fetchAllRecords 方法返回一个UsefulCodes 对象数组。所以array 的每个元素都是一个UsefulCodes 对象。因此,您不能将元素分配给文本字段的 text 属性。这就是你的错误的原因。

您需要从UsefulCodes 对象中提取相关字符串。从您的其他代码中,您将 presetList 值存储在 UsefulCodes 对象的 codename 属性中:

codeObj.codeName = [presetList objectAtIndex:i];

因此,反转该过程以从codename 属性中获取相关字符串:

UsefulCodes *codeObj = (UsefulCodes *)array[_num];
NSString *presetListValue = codeObj.codeName;
self.morseTextfield.text = presetListValue;

【讨论】:

以上是关于UIButton 从 Core Data 增加一个数组,从另一个类完成的主要内容,如果未能解决你的问题,请参考以下文章

iOS Core Data 图像实际上并未被删除

在插入Core Data之前检查textfield是否为空

Swift 中大量 Core Data 批量插入的内存泄漏

如何调整 Core Data 默认缓存的行为或大小?

在 iphone 中按住 uibutton 时增加一个值

从 Core-Data 请求不同的 NSManagedObject 属性实例时返回啥类?