2

我是 iPhone 开发的新手。我创建了一个应用程序,其中第一个选项卡栏视图加载网页,在第二个选项卡栏视图中,它解析一个 xml 文件并在表格视图中显示内容。

当我单击第二个标签栏时,只有在解析完成后才能看到标签栏视图,直到解析时间标签栏看起来像未选中。我想在解析完成后显示带有活动指示器的标签栏视图。我怎样才能实现它?

4

4 回答 4

1

没有关于的附加信息很难说,但我猜你是在解析 XML 文件里面viewDidLoad()还是loadView()。但是,解析实际上可能需要时间,并且您正在阻塞负责更新 UI 的主线程。这就是为什么您只在解析完成后才看到标签栏的原因。

为了纠正这种情况,您需要推迟显示数据的表格视图,显示活动指示器以告诉用户正在发生的事情,并启动一个后台线程来负责解析您的 XML 文件。处理完 XML 文件的线程然后停止活动指示器并使用解析的数据设置您的表格视图。

您可以使用可用的 API(等)非常轻松地做到这一点detachNewThreadSelector:toTarget:withObject:performSelectorOnMainThread:withObject:waitUntilDone:但是,您可能需要考虑利用MBProgressHUD,它提供了您需要的功能,包装在一个非常易于使用的类中。

于 2010-04-10T08:53:32.780 回答
0

我认为您应该必须在指定的时间内使用 NSTimer 类。

通过它执行解析数据的方法(即GetXMLData --用户定义的方法)方法,

NSTimer *currentTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(GetXMLData:) userInfo:nil repeats:NO];

并使用启动活动指示器

[activityIndicator startAnimating];

用下面的方法停止

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
.
.
.
[activityIndicator stopAnimating];

}

我希望你明白我在说什么......如果需要任何帮助,请发表评论......

于 2010-04-12T05:57:41.017 回答
0
  1. 不要在 MainThread 中进行解析,分离一个新线程进行解析([NSThread detachNewThreadSelector:toTarget:withObject:]
  2. 解析后(parserDidEndDocument:)使用performSelectorOnMainThread刷新 tableView。
于 2010-04-12T06:38:15.820 回答
0

我想您知道或将能够弄清楚如何使活动指示器工作。

您可以使用 NSXMLparser 委托方法来解析 xml 数据。您可以收集模型对象中的 xml 数据,这些对象作为解析 xml 的类中的属性,即一个简单的数组。然后,从您希望收到已完成解析的通知的角度来看,您可以使用键值观察 (KVO) 将其注册为这些模型对象的键路径的观察者。一旦这些属性的值发生变化,您的视图(或中间类)将收到一条消息,然后它可以使用该消息来更新显示。

只要发送消息的类与这些属性的键值编码 (KVC) 兼容,这些消息就会发送给注册的观察者。在大多数情况下,通过属性访问您的 ivars 就足够了。

添加观察者:

- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context

通知更改:

- (void)didChangeValueForKey:(NSString *)key

查看关键值观察文档:

http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html#//apple_ref/doc/uid/20002299-SW7

于 2010-04-10T13:33:47.387 回答