iPhone UITableView 怪异
Posted
技术标签:
【中文标题】iPhone UITableView 怪异【英文标题】:iPhone UITableView Weirdness 【发布时间】:2011-06-11 02:35:27 【问题描述】:我什至不知道该怎么称呼这个问题。更不用说如何寻找解决方案了。
我正在使用 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];
当向下钻取到其中一个控制器时,您可以看到另一个表表视图。
在下一个控制器的表格视图中点击“添加”按钮并添加名称或其他内容以填充表格视图时,如果您转到另一个下一个控制器的表格视图,它会填充相同的信息和另一个表格视图。
因为我遇到了臭名昭著的+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 视图和控制器数组执行此操作。 p>
当推送下一个视图时,我也会在控制台中收到此警告:
After managedObjectContext_: <NSManagedObjectContext: 0x5934e10>
我希望这一切都有意义。并且有人可以为我指明正确的方向。
提前致谢。
【问题讨论】:
【参考方案1】:您是否尝试从模拟器中删除该应用程序?有时,当您更改核心数据结构上的某些内容时,应用程序崩溃时无法正确找到数据。删除应用程序将强制它重建数据库。
【讨论】:
不是有时,当您使用核心数据模型并对其进行更改时,除非您采取适当的步骤来迁移核心数据模型,否则应用程序会崩溃......当您删除应用程序之前的核心数据模型时与所有数据一起丢失,因此如果它实际上是应用程序的第二个版本,则应迁移核心数据模型......【参考方案2】:感谢上帝!!!它已经解决了。我在我的数据模型中犯了(我敢肯定)一个菜鸟 Core Data 错误。
由于这个错误,我在模拟器(以及手机)中得到了重复:
在数据模型中,我有一个药物实体和所有属性,等等等等。我创建了一个类,并决定仅使用该类在 3 个表格视图、当前药物、过去药物和过敏症之间共享。这样做自然没有区别。我回去,创建一个新模型,合并 yada、yada,并为当前、过去和过敏添加了 3 个新实体。然后将父实体设置为主医疗实体并抽象父实体。当我再次检查并将代码重新编写为新实体时。一切正常!没有更多的重复。好吧,真的,不要再重复了。
对于我收到的警告(不是错误,应用程序仍在构建,没有崩溃并且您仍然可以通过它)是对托管对象上下文执行的。为了消除臭名昭著的 +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)
感谢所有回答的人。上帝解决了!
【讨论】:
以上是关于iPhone UITableView 怪异的主要内容,如果未能解决你的问题,请参考以下文章