MKMapView不断重置回到世界视图

时间:2011-03-08 16:50:56

标签: iphone memory mkmapview uitableview

原始问题如下。 我解决了我的问题。我为tableview和mapview设置了相同的视图控制器。我在viewDidLoad中拥有了所有的mapView init。这些都为我带来了以下问题:

1)当标签栏控制器以模态方式呈现时,我收到一个内存警告,调用了viewDidUnload(之前我没有做任何事情)。当模态标签栏控制器被解除并且调用viewDidLoad时,它会重置我的mapView。 2)当标签栏控制器以模态方式呈现并且在使用视图控制器移动到选项卡然后切换到该选项卡之前我收到内存警告时,我的viewDidLoad在我的mapView控制器中被调用,它重置了我的地图,而它没有重置表属性,以便我的tableView不起作用。

非常感谢Anomie帮助我调试这个问题,并更好地了解这些部分是如何连接起来的。事情现在很好用,我的应用程序有更好的设计。

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

  • 这绝不会发生在模拟器上
  • 我发现设备上发生这种情况时会发出内存警告
  • 我的应用程序发生内存警告时没有做任何事情,因此没有任何内容可以触及mapview

另外,我的模态视图控制器中的tableview有时也显示空白(aroudn内存警告的时间)。当它出现空白时,通常调用以获取行数,行数和数据的方法根本不会被调用。取消模态视图控制器并重新打开它后,数据就可以了,因此数据不会被删除..

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

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];

1 个答案:

答案 0 :(得分:2)

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

对于你的桌面视图,我不确定。您是否在创建包含视图控制器的代码中将数据源和委托分配给表视图,而不是在视图控制器的viewDidLoad方法中执行此操作?