2

, пожалуйста, попробуйте помочь мне здесь. У меня есть некоторые действительно странные ошибки, пытающиеся отсортировать объекты вида таблицы строк.Сортировка с использованием NSSortDescriptor по временной ошибке (с базовыми данными)

поведение просто, у меня есть:

CreateViewController - здесь я создаю строки и добавить их к основным данным

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

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

Так оно и есть.

Проблема:

Если нет НИКАКИХ строки в виде таблицы, а затем добавить строку на странице создания, он будет создаваться в порядке, но если добавить еще один, новый один находится на вершине список ... но если я закончу приложение и снова его открою, заказ будет прекрасен.

Есть также некоторые другие странное поведение после того, как я добавить больше строк ... Но дело в том, когда я прекратить приложение и открыть его снова все упорядочено совершенно ..:/

Это соответствующий код :

CreateViewController.m

- (id)init { 
    self = [super initWithNibName:@"CreateViewController" bundle:nil]; 
    if (self) { 
    } 
    return self; 
} 


- (void)save { 

    if (self.myTextView.text.length == 0) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hey!" message:@"You can't save a blank string" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
     [alert show]; 
    } 

    [self insertTeget]; 

    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

    [self.myTextView resignFirstResponder]; 
} 

//this is where I add the string to the NSManagedObject object I have called 'Target' 
- (void)insertTeget { 

    CoreDataStack *stack = [CoreDataStack defaultStack]; 
    Target *target = [NSEntityDescription insertNewObjectForEntityForName:@"Target" inManagedObjectContext:stack.managedObjectContext]; 
    if (self.myTextView.text != nil) { 
     target.body = self.myTextView.text; 
    } 

    [stack saveContext]; 
} 

Это вид таблицы:

StackTableViewController.m

- (id)init { 

    self = [super initWithNibName:@"StackTableViewController" bundle:nil]; 
    if (self) { 

     [self fetchData]; 
    } 
    return self; 
} 

//currentTarget is a string I have in the .h file to pass the home view controller the first string of the table view 
- (void)fetchData { 
    [self.fetchedResultController performFetch:nil]; 
    if (self.fetchedResultController.fetchedObjects.count > 0) { 
     NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0]; 
     Target *current = [self.fetchedResultController objectAtIndexPath:indexPath]; 
     self.currentTarget = current.body; 
    }else { 
     self.currentTarget = nil; 
    } 
} 

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    [self fetchData]; 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    // Return the number of sections. 
    return self.fetchedResultController.sections.count; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultController sections][section]; 
    return [sectionInfo numberOfObjects]; 
} 

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewCellEditingStyleDelete; 
} 

//here I'm updating the delegate when A cell was deleted so I can update the label in the home view controller 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    Target *target = [self.fetchedResultController objectAtIndexPath:indexPath]; 
    CoreDataStack *stack = [CoreDataStack defaultStack]; 
    [[stack managedObjectContext] deleteObject:target] ; 
    [stack saveContext]; 

    if ([_delegate respondsToSelector:@selector(didDeleteObject)]) { 
     [self fetchData]; 
     [_delegate didDeleteObject]; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *cellIdentifier = @"StackTableViewCell"; 

    Target *target = [self.fetchedResultController objectAtIndexPath:indexPath]; 

    StackTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) 
    { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"StackTableViewCell" owner:self options:nil]; 
     cell = [topLevelObjects objectAtIndex:0]; 
    } 

    cell.cellLabel.text = target.body; 

    return cell; 
} 

// this is my fetch request where im setting up the sort descriptor 
- (NSFetchRequest *)targetsFetchRequest { 

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Target"]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    return fetchRequest; 
} 


- (NSFetchedResultsController *)fetchedResultController { 

    if (_fetchedResultController != nil) { 
     return _fetchedResultController; 
    } 

    CoreDataStack *stack = [CoreDataStack defaultStack]; 

    NSFetchRequest *fetchRequest = [self targetsFetchRequest]; 

    _fetchedResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:stack.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

    _fetchedResultController.delegate = self; 

    return _fetchedResultController; 

} 

Это контроллер дома вид где Im обновление метки:

- (id)init { 
    self = [super initWithNibName:@"HomeViewController" bundle:nil]; 
    if (self) { 
     stackTableViewController = [[StackTableViewController alloc] init]; 
     stackTableViewController.delegate = self; 
    } 
    return self; 
} 


- (void)viewWillAppear:(BOOL)animated { 
    [stackTableViewController fetchData]; 
    self.homeLabel.text = stackTableViewController.currentTarget; 
} 

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    self.homeLabel.text = stackTableViewController.currentTarget; 
} 

//this is the delegate method 
- (void)didDeleteObject { 
    self.homeLabel.text = stackTableViewController.currentTarget; 
} 

- (IBAction)goToStack:(id)sender { 

    [self.navigationController pushViewController:stackTableViewController animated:YES]; 
} 

- (IBAction)goToCreate:(id)sender { 

    CreateViewController *createViewController = [[CreateViewController alloc]initWithNibName:@"CreateViewController" bundle:nil]; 
    UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:createViewController]; 
    [self.navigationController presentViewController:navigationController animated:YES completion:nil]} 

Пожалуйста, пожалуйста, пожалуйста, это сводит меня с ума, поэтому заказ в порядке только после того, как я закончить приложение? спасибо @@@!

+0

Я дам бонус 0f 50p за ответ, который решит его для меня через 2 дня :) –

+0

Что такое 'time', и где он установлен? – Wain

+0

Время os свойство в моем классе nsmanagedobject под названием target –

ответ

1

Я не вижу, чтобы вы настраивали время в любом месте. Он должен быть установлен в [NSDate date] при создании объекта, если он действует как дата создания.

+0

такая глупая ошибка:/thankssssss! что drivd меня сумасшедший haha ​​ –

+0

в контроллере представления представления я добавил target.time = [дата NSDate]; в методе insertTarget и BAM, он работает :) –