【问题标题】:UIButton that increments an array from Core Data, done from another classUIButton 从 Core Data 增加一个数组,从另一个类完成
【发布时间】: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 数组中的字符串,但我无法将其传递到我的文本字段中。欢迎对我的问题提出任何见解。

【问题讨论】:

    标签: ios objective-c arrays core-data uibutton


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多