好吧,这是一个非常奇怪的,所以我将布局正在发生的事情,然后给出一些代码。对于我的例子,我将使用静态数量的视图,2。
基础知识
我有一个UIPageControl,添加了X个子视图。在每个子视图上,viewDidLoad是一个NSXMLParse,用于获取XML提要。获取提要后,将对其进行解析,并使用已解析的数组重新加载表。每个视图上还有一个“设置”按钮。按下“设置”按钮后,将运行UIModalTransitionStyleCoverVertical:Animated:YES,并且UINavigationController将以完整动画向上滑动到视图中。 Dismiss还会显示动画滑出到上一个视图。如果您在“设置”中,则可以将PushViews深入两级(幻灯片动画)。
问题
当您点击“设置”按钮时,随机构建应用程序并运行(未恢复)时,动画不会发生。除了删除所有核心动画外,一切都很实用。 DismissModal只是交换回上一个屏幕。导航控制器中的PushView不再有任何动画,只显示下一个视图。
如果您退出应用(杀死进程)并重新启动它,它可能会在一段时间内正常工作,但在某些时候点击“设置”按钮时,它将丢失所有动画。< / p>
详情
我开始使用Apples PageControl Application进行基础工作。它会根据用户设置创建动态数量的视图。
- (void)awakeFromNib
{
kNumberOfPages = 2;
// view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (int i = 0; i < kNumberOfPages; i++)
{
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;
pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = 0;
// pages are created on demand
// load the visible page
// load the page on either side to avoid flashes when the user starts scrolling
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
- (void)loadScrollViewWithPage:(int)page
{
if (page < 0)
return;
if (page >= kNumberOfPages)
return;
// replace the placeholder if necessary
SecondViewController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
controller = [[SecondViewController alloc] initWithPageNumber:page];
[viewControllers replaceObjectAtIndex:page withObject:controller];
[controller release];
}
// add the controller's view to the scroll view
if (controller.view.superview == nil)
{
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.view.frame = frame;
[scrollView addSubview:controller.view];
}
}
生成每个视图时,它在viewDidLoad
中运行NSXMLParse。到目前为止,一切正常。生成两个视图,您可以在它们之间滑动。
如果按“设置”按钮
- (IBAction)settingsButtonPressed:(id)sender;
{
SettingsViewController *settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:settingsViewController];
navigationController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navigationController animated:YES];
[settingsViewController release];
[navigationController release];
}
此时,SettingsViewController出现在视图中。但是,有时它会以适当的动画向上滑动。其他时候它会出现,所有进一步的核心动画都会被打破,直到重新开始这个过程。
我经历了检查所有NSXMLParse并将问题缩小到一行。在我的每个子视图中,都是一个tableView,在XML解析完成后,我创建了一个包含结果的数组并运行[self.tableview reloadData]
。如果我注释掉该行,那么表格显然只会加载空白,但它与动画没有任何问题。
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSMutableArray *tableData = ARRAY_GENERATED_HERE;
[self.tableView reloadData];
}
我的测试
我将从我的测试中注意到,如果kNumberOfPages设置为1而不是2,一切都很好。只生成1个视图,动画故障永远不会发生。添加第二个视图,通常在打开的设置中五次,它会出现故障。
仍然没有找到解决方案,但它与[tableView reloadData]
有关。任何见解都会很棒。
使用以下命令在viewDidLoad中获取我的XML:
[NSThread detachNewThreadSelector:@selector(parseXMLFileAtURL:) toTarget:self withObject:path];
- (void)parseXMLFileAtURL:(NSString *)URL
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
stories = [[NSMutableArray alloc] init];
//you must then convert the path to a proper NSURL or it won't work
NSURL *xmlURL = [NSURL URLWithString:URL];
// here, for some reason you have to use NSClassFromString when trying to alloc NSXMLParser, otherwise you will get an object not found error
// this may be necessary only for the toolchain
rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
[rssParser setDelegate:self];
// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];
[rssParser parse];
[pool release];
}
答案 0 :(得分:2)
从你的评论中,你说你在后台线程中运行解析器... UIKit不是线程安全的,我怀疑是什么导致你的问题...尝试在主线程上进行reloadData调用,你可以使用NSObjects performSelectorInMainThread来做到这一点......
[self performSelectorOnMainThread:@selector(operationComplete) withObject:nil waitUntilDone:false];