iPhone UITableView怪异

时间:2011-06-11 02:35:28

标签: iphone uitableview core-data uitabbar nsmanagedobjectcontext

我甚至不确定该怎么称呼这个问题。更不用说如何搜索解决方案。

我正在使用Xcode 4。 我正在使用CoreData。 我有标签栏应用程序。 4个不同的标签。 这是模拟器的一个问题。

两个选项卡的根表视图由一组控制器填充。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSUInteger row = [indexPath row];

SecondViewController *nextController = [self.medControllersArray objectAtIndex:row];
[self.navigationController pushViewController:nextController
                                     animated:YES];
}

当向下钻取到其中一个控制器时,您可以看到另一个表格视图。

当点击下一个控制器的表视图中的Add按钮并添加一个名称或其他任何内容来填充表视图时,如果你转到另一个下一个控制器的表视图,它将填充相同的信息和另一个表视图。

因为我得到了臭名昭着的+entityForName错误

我在viewDidLoad

中添加它
 if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(MIT2AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSLog(@"After managedObjectContext_: %@",  managedObjectContext);
}

在应用的委托方法application:didFinishLaunchingWithOptions

中添加此内容
ViewController *viewController = [[ViewController alloc] init];
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
    NSLog(@"\nCould not create *context for self");
}

viewController.managedObjectContext = context;

我为每个 next 视图控制器和 root 视图执行了此操作,这两个选项卡的根视图未由控制器和控制器数组填充。

当按下下一个视图时,我也会在控制台中收到此警告:

After managedObjectContext_: <NSManagedObjectContext: 0x5934e10>

我希望这一切都有道理。有人可以指出我正确的方向。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试从模拟器中删除该应用?有时,当您更改核心数据结构上的内容时,应用程序崩溃,无法正确找到数据。删除应用程序将强制它重建数据库。

答案 1 :(得分:0)

感谢上帝!它已经成功了。我在我的数据模型中犯了一个新的Core Data错误(我很确定)。

由于这个错误,我在模拟器(以及手机)中得到了重复:

在数据模型中,我有一个药物实体和所有属性,等等,等等,等等。我创建了一个类,并决定只使用该类来分享3个表视图,当前的meds,过去的meds和过敏。在这样做时,自然没有区别。我回去了,创建了一个新模型,合并了yada,yada,并为当前,过去和过敏添加了3个新实体。然后将父实体设置为主med实体并抽象父实体。当我再次经历并将代码重新编写为新实体时。一切正常!没有更多的重复。嗯,真的,没有更多的三倍。

对于我收到的警告(不是错误,应用程序仍然构建,没有崩溃,你仍然可以通过它)对托管对象上下文做了。为了消除臭名昭着的+ entityForName错误,我尝试了一些我在书中或Apple中看到过的东西。我将AppDelegate导入到每个表中,并在fetchedResultsController中执行了此操作:

- (NSFetchedResultsController *)fetchedResultsController {
MIT2AppDelegate *mit = [[MIT2AppDelegate alloc] init];

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}
    //if (fetchedResultsController == nil) {
    // Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];


    //  the entity name
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Allergies" inManagedObjectContext:mit.managedObjectContext];
[fetchRequest setEntity:entity];

在重新编写代码时,我尝试了tomasBULL推荐的内容: How can I solve NSInternalInconsistencyException', reason: '+entityForName: fail report

这就是错误的来源。所以我回到了之前和现在的状态,没有更多的错误。

我在AppDelegate managedObjectModel中执行此操作

- (NSManagedObjectModel *)managedObjectModel{
    if (managedObjectModel != nil){
        return managedObjectModel;
    }

    NSString *path = [[NSBundle mainBundle]  pathForResource:@"MIT2ver 3" ofType:@"mom" inDirectory:@"MIT2ver2.momd"];

        NSURL *momURL = [NSURL fileURLWithPath:path];
        managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

    return managedObjectModel;
}

因为在我添加模型之前我犯了另一个菜鸟错误之前,我拿出了空间。感谢udibr回答:Implementation of “Automatic Lightweight Migration” for Core Data (iPhone)

感谢所有回答的人。上帝解决了这个问题!