【问题标题】:MKMapView keeps resetting back to the world viewMKMapView 不断重置回世界视图
【发布时间】:2011-03-08 16:50:56
【问题描述】:

原始问题如下。 我解决了我的问题。我为 tableview 和 mapview 设置了相同的视图控制器。而且我在 viewDidLoad 中有我所有的 mapView 初始化。这两者一起给我带来了以下问题:

1) 当标签栏控制器以模态方式呈现并且我收到内存警告时,调用了 viewDidUnload(我之前什么也没做)。当模态标签栏控制器被关闭并调用 viewDidLoad 时,它重置了我的 mapView。 2) 当标签栏控制器以模态方式呈现并且我在使用视图控制器移动到标签然后切换到该标签之前收到内存警告时,我的 viewDidLoad 在我的 mapView 的控制器中被调用,它重置了我的地图,但它没有重置表格属性,使我的 tableView 无法工作。

非常感谢 Anomie 帮助我调试了这个问题,并更好地了解了这些部分是如何相互关联的。现在一切都很好,而且我的应用程序设计得更好了。

原问题: 我有一个具有地图视图的应用程序,当我以模态方式呈现选项卡栏视图控制器时,每隔一段时间,当我取消模态视图控制器时,地图就会重置回世界视图,就像按下重置按钮一样。一些细节:

  • 模拟器上永远不会发生这种情况
  • 在我的设备上发生这种情况时,我注意到内存警告
  • 当我的应用程序中发生内存警告时,我什么都不做,所以应该没有任何东西触及地图视图

此外,我的模态视图控制器中的表格视图有时也会显示为空白(大约在内存警告时)。当它出现空白时,通常调用来获取行数、节数和数据的方法根本不会被调用。取消模态视图控制器并重新打开它后,数据就在那里,所以数据不会被删除..

我用来创建标签栏控制器、选择器和表格的代码:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
// Display only a person's address(es)
NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonAddressProperty],
                                                           nil];  
picker.displayedProperties = displayedItems;

UITabBarItem *peoplePickerTabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemContacts tag:0];
picker.tabBarItem = peoplePickerTabBarItem;

UITableViewController *tvc = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
tvc.tableView.delegate = self;
tvc.tableView.dataSource = self;
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:tvc];
UIBarButtonItem *uibbiCancel = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancelTable)];
tvc.navigationItem.rightBarButtonItem = uibbiCancel;
tvc.title = @"Recents";
UITabBarItem *nvcTabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemRecents tag:2];
nvc.tabBarItem = nvcTabBarItem;

tbc = [[UITabBarController alloc] init];

NSArray *sections = [[NSArray alloc] initWithObjects:picker, nvc, nil];

[tbc setViewControllers:sections];

[self presentModalViewController:tbc animated:YES];
[nvcTabBarItem release];
[uibbiCancel release];
[tvc release];
[peoplePickerTabBarItem release];
[picker release];
[nvc release];
[sections release];
[tbc release];

【问题讨论】:

  • 您可以在模拟器中发出内存警告(在硬件菜单中)。在设备上,您可以在调试器中执行相同操作:call (void) [[UIApplication sharedApplication] _performMemoryWarning]。也许,这有助于调试问题。

标签: iphone memory mkmapview uitableview


【解决方案1】:

对于您的地图视图,可能发生的情况是:当 UIViewController 没有被主动显示时(例如,它位于 UITabViewController 的未显示选项卡中,而不是 UINavigationController 中的可见视图中,或者被模态呈现的视图控制器),如果发生内存通知,它可能会释放其视图。然后它会在需要时重新创建视图。

对于您的表格视图,我不确定。您是否在创建包含视图控制器的代码中将数据源和委托分配给表视图,而不是在视图控制器的 viewDidLoad 方法中这样做?

【讨论】:

  • 或者数据源可能是手机决定它可以摆脱的另一件事。
  • @Walter:在这种情况下,它可能会以 EXC_BAD_ACCESS 中止,因为表视图试图调用数据源方法而不是继续在没有数据的情况下运行。
  • @Anomie:这一定是 mapView 发生的事情。当我刚刚以模态方式呈现 ABPeoplePickerNavigationController 之前,它从未发生过,但是当我切换并将这个选择器与最近和收藏夹一起添加到 uitabbarcontroller 时,它开始发生。我能做些什么来阻止它摆脱地图视图吗?至于数据表,我没有单独的视图控制器 viewDidLoad 方法。我将所有内容都链接回我从中加载所有内容的同一视图控制器。更多信息发布在原始线程中
  • 对于地图视图,我没有看到上面创建它的代码。您可能已经有一个 UIViewController 子类。如果您从笔尖加载它,您需要让控制器在viewDidUnload 中记录注释等(在释放ivar 之前),以便它可以在viewDidLoad 中恢复它们;如果您以编程方式执行此操作,则不能在 viewDidUnload 中发布地图视图(如果 viewDidLoad 中已经存在,则不要重新创建它)。
  • @anomie:我目前在 mapView 的视图控制器的 viewDidUnload 中没有任何东西(这是我拥有所有东西的同一个视图控制器,这可能是我需要通过分离来解决的问题表格视图分成单独的 .h 和 .m)。我确实在 viewDidLoad 中有代码来设置地图视图,这可能就是为什么即使我没有在viewDidUnload 中清除它也会重置它的原因。感谢您的帮助,如果 mapView 已经存在,我应该在 viewDidLoad 中什么都不做,或者在加载/卸载中进行释放和重新创建。 RE:Table 我试试看
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2018-01-29
  • 2014-02-01
  • 2022-11-23
  • 2020-09-30
相关资源
最近更新 更多