что не так с этим кодом? не заполнять таблицу из основных данных !! IPad - PullRequest
0 голосов
/ 24 декабря 2010

Пожалуйста, помогите мне решить эту проблему (я схожу с ума сейчас!), Мой проект правильно сохраняет данные в sqlite db в coredata, как это проверено в графическом менеджере SQLite, но я не могу показать в табличном представлении мне нужна моя таблица внутри моего viewController (маленькая таблица, а не весь экран),

Если вы чувствуете себя щедрым, пожалуйста, проверьте мой маленький пример проекта Здесь Спасибо!

здесь код * viewcontroller.h

(Обратите внимание, что я включил IBoutlet для табличного представления, поскольку tableView не является экземпляром в UIViewController!) Это было сделано правильно ?, Кроме того, я получаю 7 предупреждений, где я вызываю tableView> Local объявление 'tableView' скрывает переменную экземпляра

#import <UIKit/UIKit.h>


@interface CoreDataEnsaViewController : UIViewController 
<UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate> //va     controller delegate??


{

UITextField *name;
UITextField *address;
UITextField *phone;
UILabel         *status;


//la table
//NSMutableArray *array;

//la tabla??
UITableView *tableView;
NSFetchedResultsController *_fetchedResultsController;
NSManagedObjectContext *_context;  
}

@property (nonatomic, retain) IBOutlet UITextField *name;
@property (nonatomic, retain) IBOutlet UITextField *address;
@property (nonatomic, retain) IBOutlet UITextField *phone;
@property (nonatomic, retain) IBOutlet UILabel *status;

@property (nonatomic, retain) IBOutlet UITableView *tableView;

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *context;

- (IBAction) saveData;
- (IBAction) findContact;
- (IBAction) showbtn:(id) sender;

@end

и здесь * viewController.m

#import "CoreDataEnsaViewController.h"
#import "CoreDataEnsaAppDelegate.h"
#import "ShowViewController.h"

#import "Contacts.h"

@implementation CoreDataEnsaViewController

ShowViewController *showView;

@synthesize name, address, phone, status, tableView;

@synthesize context = _context;
@synthesize fetchedResultsController = _fetchedResultsController;

-(IBAction) showbtn:(id) sender {

showView = [[ShowViewController alloc] initWithNibName:@"ShowViewController"  bundle:nil];

//anima
[UIView beginAnimations:@"flipping view" context:nil];
   [UIView setAnimationDuration:1];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown 
                       forView:self.view cache:YES];

[self.view addSubview:showView.view];
[UIView commitAnimations];  

}

  - (void) saveData
 {
CoreDataEnsaAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = [appDelegate managedObjectContext];

NSManagedObject *newContact;

newContact = [NSEntityDescription insertNewObjectForEntityForName:@"Contacts"  inManagedObjectContext:context];

[newContact setValue:name.text forKey:@"name"];
[newContact setValue:address.text forKey:@"address"];
[newContact setValue:phone.text forKey:@"phone"];

name.text = @"";
address.text = @"";
phone.text = @"";

NSError *error;
[context save:&error];
status.text = @"Contact saved";
    }

    - (void) findContact
   {
CoreDataEnsaAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = [appDelegate managedObjectContext];

NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Contacts" inManagedObjectContext:context];

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

[request setEntity:entityDesc];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name = %@)", name.text];

[request setPredicate:pred];

NSManagedObject *matches = nil;
NSError *error;

NSArray *objects = [context executeFetchRequest:request error:&error];

if ([objects count] == 0) {
    status.text = @"No matches";
} else {
    matches = [objects objectAtIndex:0];
    address.text = [matches valueForKey:@"address"];
    phone.text = [matches valueForKey:@"phone"];
    status.text = [NSString stringWithFormat:@"%d matches found", [objects  count]];
}
[request release];
    }

- (NSFetchedResultsController *)fetchedResultsController {

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

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contacts" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];

//NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"details.closeDate"  ascending:NO];
//[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_context sectionNameKeyPath:nil cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

[fetchRequest release];
[theFetchedResultsController release];

return _fetchedResultsController;    


}




// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];


}



- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation {
// Overriden to allow any orientation.
return YES;
}


- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}


- (void)viewDidUnload {
self.name = nil;
self.address = nil;
self.phone = nil;
self.status = nil;
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}



//tabla

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section {

 id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController  sections] objectAtIndex:section];
 return [sectionInfo numberOfObjects];

//return [array count];
//return [[fetchedResultsController sections] count];
  }


- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

    Contacts *info = [_fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = info.name;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@, %@", info.address, info.phone];

}


  //---insert individual row into the table view---

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

static NSString *CellIdentifier = @"Cell";
//---try to get a reusable cell---

UITableViewCell *cell = [tableView  dequeueReusableCellWithIdentifier:CellIdentifier];



//---create new cell if no reusable cell is available---

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


}


// Set up the cell...
[self configureCell:cell atIndexPath:indexPath];



return cell;

 } 



  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

[tableView deselectRowAtIndexPath:indexPath animated:YES];



}

 //tabla end



 - (void)dealloc {
[name release];
[address release];
[phone release];
[status release];

self.fetchedResultsController = nil;
self.context = nil;

[super dealloc];
}


 #pragma mark NSFetchedResultsControllerDelegate methods

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller is about to start sending change notifications,  so    prepare the table view for updates.
    [self.tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            // Reloading the section inserts a new row and ensures that titles are updated appropriately.
            [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    [self.tableView endUpdates];}



@end

Соединения в XIB> вид таблицы выход: источник данных ----------- владелец файла; делегат -------------- владелец файла; ссылочные точки tableView ------------- владелец файлов; большое спасибо !!!!

Ответы [ 2 ]

1 голос
/ 21 апреля 2013

Что касается «NSInternalConsistencyException», проверьте модель управляемого объекта на соответствие своему коду и убедитесь, что вы вызываете ее абсолютно правильно. В противном случае, вы сделали чистый, перезапущенный XCode, перезагрузили компьютер, удалили приложение из симулятора, обычные вещи? Если вы внесли изменения в файл или выгружали его, старые вещи иногда «прячутся» и вызывают эти проблемы. В противном случае, иногда, когда у меня возникает проблема с основными данными, перестройка файла модели с нуля и автоматическое создание подклассов это исправит ... не знаю почему.

Я знаю, что это был не ваш вопрос, но очень не рекомендуется просто вызывать делегат приложения для контекста управляемого объекта - хотя это работает, и вы увидите это в некоторых примерах кода, это не лучшая практика. Это вносит ненужную зависимость в ваш проект, что сделает ваш код сложнее поддерживать. Делегат приложения должен использоваться только для обработки событий системного уровня, как он был спроектирован, а не для "злоупотребления" для других целей. Лучший способ - создать свойство контекста управляемого объекта для каждого контроллера, которому оно необходимо, и передать ссылку при создании этого контроллера. Ваш делегат приложения передаст его корневому контроллеру представления в didFinishLaunchingWithOptions (просто путем установки свойства принимающего контроллера), например:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions...
{
  UINavigationController *navController = self.window.rootViewController
  MyViewController *controller = navController.viewControllers[0];
  controller.managedObjectContext = self.managedObjectContext;

  return YES;
}

Когда этот корневой контроллер представления должен передать MOC другому контроллеру, это происходит следующим образом:

-(void)prepareForSegue...
{
  MyOtherController *otherController = [segue destinationViewController];
  controller.managedObjectContext = self.managedObjectContext;
}

И так далее, и так далее, для каждого контроллера, который в этом нуждается. Таким образом, вы не вводите ненужных зависимостей, которые делают ваш код менее модульным и пригодным для повторного использования.

Надеюсь, это помогло.

0 голосов
/ 24 декабря 2010

Попробуйте добавить этот код, чтобы выполнить выборку данных в вашем методе viewDidLoad:

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
    NSLog(@"Unsolved error: %@, %@", error, [error userInfo]);
    abort();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...