在导航到ViewController之前,为ViewController加载数据的最佳方法是什么?

时间:2015-02-19 19:51:10

标签: ios objective-c

在我的应用程序中,有两个视图控制器导航到DetailsViewController。

现在,当DetailsViewController出现时,我从服务器获取数据并在UI上显示它。我不喜欢这个,因为在网络请求进行时UI是空白的。我想要的是将数据加载到先前的视图控制器中,然后传递给DetailsViewController。

现在问题是我在两个视图控制器中有完全相同的“load-data-then-then-push”代码,我不确定删除重复的最明智的方法是什么。

一个想法是让两个视图控制器继承一个包含加载/推送方法的公共超类。我不喜欢这种策略,因为假设我有更多像ViewViewController这样的ViewControllers,我不想为每一个编写一个加载超类。

另一个想法是在DetailsViewController中定义一个静态方法,两个视图控制器可以调用它,但是这个方法包含UI相关代码(具体来说,代码显示HUD Progressbar和UIAlertView,以防网络提取失败)这让我不舒服。

我是iOS和Objective-C的新手,所以我可能会遗漏一些简单而明显的东西。

3 个答案:

答案 0 :(得分:1)

在这种情况下,我最喜欢创建一个处理数据加载的新类(如http-request等),并为此类创建委托协议。然后可以在两个viewControllers中实现此委托回调,然后在调用时执行推送到DetailsViewController的segue。委派是一个非常好的强大功能,请查看此处的文档:Delegation

答案 1 :(得分:0)

好吧,我最好在评论中写一下,但我没有名气。

想象一下,你正在阅读一篇有几个学生信息的json(姓名,年份等) 您可以使用将要读取的属性创建一个student对象,并创建一个将在后台运行的方法的对象,该方法将负责访问您的WS(JSON或其他任何内容)并将此信息记录到student对象。因此,如果您有10名学生,您将拥有一个包含10名学生的NSArray。这个数组就是你下一个viewcontroller的用途。

这是很多代码,但你很容易想到例子。

答案 2 :(得分:0)

如果使用Storyboard,可以使用prepareForSegue: sender:将数据/模型类传递给DetailsViewController。如果你使用xib,你可以在实例化DetailsViewController之后和推送它之前做同样的事情。

如果您需要从服务器加载后续数据,您应该编写一个为您提供此网络内容的类。

如果DetailsViewController需要加载一些额外的数据,你可以使用类似Andy建议的加载视图。这是一种广泛使用的方法。