Нулевое значение в контексте в WKInterfaceTable didSelectRowAtIndex

Я установил таблицу watchkit, которая отлично работает. Но когда я пытаюсь использовать метод didSelectRowAtIndex WKInterfaceTable со значением, которое должно существовать для контекста, контекст дает нулевое значение. Созданное мной тестовое значение контекста работает нормально, и метод работает и отправляет правильно заполненный DetailInterfaceController. См. приведенный ниже код для InterfaceController.m:

- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];

// Configure interface objects here.

    [self updateWatchTable];

}


-(void)updateWatchTable{

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Cschedule" inManagedObjectContext:[[CoreDataHelper sharedHelper] context]];

[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"trueDate" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

NSArray *myResults = [[[CoreDataHelper sharedHelper] context] executeFetchRequest:fetchRequest error:nil];

self.objectsTable = myResults;

NSLog(@"Schedule myResults count: %lu", (unsigned long)myResults.count);

[self.table setNumberOfRows:self.objectsTable.count withRowType:@"ScheduleTableRow"];

    for (int i = 0; i < self.objectsTable.count; i++) {
        ScheduleTableRow *scheduleRow = [self.table rowControllerAtIndex:i];
        NSManagedObject *item = self.objectsTable[i];
        scheduleRow.name.text = [NSString stringWithFormat:@"%@",[item valueForKey:@"day"]];
        scheduleRow.date.text = [NSString stringWithFormat:@"%@",[item valueForKey:@"date"]];

    }

}


- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex
{
// Push detail view with selected quote

NSString * scheduleDate = [[self.objectsTable objectAtIndex:rowIndex] valueForKey:@"date"];
NSString * test = @"Feb 1 2016"; //TEST date 

[self pushControllerWithName:@"DetailScheduleInterfaceController" context:test]; //THIS WORKS WITH TEST date AND CORRECTLY PUSHES POPULATED DetailInterfaceController
//[self pushControllerWithName:@"DetailScheduleInterfaceController" context:scheduleDate]; //THIS PUSHES BLANK DetailInterfaceController SINCE scheduleDate IS NULL

NSLog(@"Count in objectsTable = %lu", (unsigned long)self.objectsTable.count);
NSLog(@"Value for scheduleDate = %@", scheduleDate); //THIS GIVES NULL VALUE
}

person bachma0507    schedule 19.11.2015    source источник
comment
Я предполагаю, что self.objectsTable - это массив. Итак, когда вы NSLog self.objectsTable в didSelectRowAtIndex, что вы получаете? Метод отладки, который я предлагаю вам сделать, это NSLog self.objectsTable в didSelectRowAtIndex, если это дает вам правильный результат, NSLog [self.objectsTable ObjectAtIndex:rowIndex], и покажите нам, каковы результаты для этих двух вещей. Давайте просто убедимся, что этот массив заполнен и имеет правильные результаты и пару ключ-значение с контрольной датой.   -  person MSU_Bulldog    schedule 19.11.2015
comment
когда я считаю, я получаю 5, что является правильным счетом. Количество в objectTable = 5   -  person bachma0507    schedule 19.11.2015
comment
Итак, в вашем массиве явно 5 объектов. А как насчет того, когда вы NSLog используете objectAtIndex? Дает ли это вам правильный результат с парой ключ-значение с контрольной датой?   -  person MSU_Bulldog    schedule 19.11.2015
comment
Когда я делаю NSLog [self.objectsTable ObjectAtIndex:rowIndex], я получаю <NSManagedObject: 0x78764d30> (entity: Cschedule; id: 0x7875ee20 <x-coredata://D97B0CD4-6B54-4760-9714-ECA07E6A4F10/Cschedule/p18> ; data: <fault>)   -  person bachma0507    schedule 19.11.2015
comment
Проверьте мой ответ и посмотрите, работает ли это для вас. Я думаю, что self.objectsTable заполнен NSManagedObject, поэтому вам нужно получить NSManagedObject, а затем получить пару ключ-значение даты из NSManagedObject.   -  person MSU_Bulldog    schedule 19.11.2015


Ответы (2)


Я думаю, ваша проблема в том, что вы назначаете строку NSManagedObject. Попробуйте сделать это так, как вы делали это в своем цикле в updateWatchTable.

В вашем методе didSelectRowAtIndex:

NSManagedObject *item = self.objectsTable objectAtIndex[rowIndex];
NSString * scheduleDate = [NSString stringWithFormat:@"%@",[item valueForKey:@"date"]];
person MSU_Bulldog    schedule 19.11.2015
comment
К сожалению, я все еще получаю Value for scheduleDate = (null) после внесения предложенных выше изменений. - person bachma0507; 19.11.2015

Код ниже - это то, что решило это для меня. Я создал массив для хранения MSManageObjects в цикле for. Затем в методе didSelectRowAtIndex WKInterfaceTable я сделал objectAtIndex: rowIndex для массива.

[self.table setNumberOfRows:self.objectsTable.count withRowType:@"ScheduleTableRow"];

self.myNewArray = [[NSMutableArray alloc] init];

    for (int i = 0; i < self.objectsTable.count; i++) {
        ScheduleTableRow *scheduleRow = [self.table rowControllerAtIndex:i];

        NSManagedObject *item = self.objectsTable[i];
        scheduleRow.name.text = [NSString stringWithFormat:@"%@",[item valueForKey:@"day"]];
        scheduleRow.date.text = [NSString stringWithFormat:@"%@",[item valueForKey:@"date"]];
        [self.myNewArray addObject:[item valueForKey:@"date"]];
    }

- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex
{
// Push detail view with selected quote

NSString * scheduleDate = [NSString stringWithFormat:@"%@", [self.myNewArray objectAtIndex:rowIndex]];

[self pushControllerWithName:@"DetailScheduleInterfaceController" context:scheduleDate];
}
person bachma0507    schedule 22.11.2015