我有几个控制器。出于某种原因,我使用UISegmentedControl而不是标签栏。
每个控制器都从服务器下载数据。我的问题是,如果我移动到下一个视图控制器并返回到以前的视图控制器,我需要重新下载。
如何使用UISegmentedControl更改视图控制器而不破坏以前的控制器,因此我不需要再次重新下载。每次我移动到不同的viewcontroller
这是我的代码
class ContentViewController: UIViewController {
private let homeViewController: HomeViewController!
private let aboutViewController: AboutViewController!
private let liveTVViewController: LiveTVViewController!
private let programsViewController: ProgramsViewController!
private var currentViewController: UIViewController!
var userDeviceType: Int!
override func viewDidLoad() {
super.viewDidLoad()
let viewController = viewControllerForSegmentIndex(0)
self.addChildViewController(viewController)
viewController.view.frame = self.view.bounds
self.view.addSubview(viewController.view)
currentViewController = viewController
NSNotificationCenter.defaultCenter().addObserver(self, selector: "segmentChanged:", name: "SegmentChangedNotification", object: nil)
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func segmentChanged(notification: NSNotification) {
let userInfo = notification.userInfo as [String: AnyObject]
let selectedIndex = userInfo["selectedIndex"] as Int
let viewController = viewControllerForSegmentIndex(selectedIndex)
self.addChildViewController(viewController)
self.transitionFromViewController(currentViewController,
toViewController: viewController,
duration: 0.0,
options: UIViewAnimationOptions.CurveEaseIn,
animations: { () -> Void in
self.currentViewController.view.removeFromSuperview()
viewController.view.frame = self.view.bounds
self.view.addSubview(viewController.view)
}) { (finished: Bool) -> Void in
viewController.didMoveToParentViewController(self)
self.currentViewController.removeFromParentViewController()
self.currentViewController = viewController
}
}
func viewControllerForSegmentIndex(index: Int) -> UIViewController {
var viewController: UIViewController
if index == 0 {
viewController = self.storyboard!.instantiateViewControllerWithIdentifier("HomePage") as HomeViewController
(viewController as HomeViewController).userDeviceType = userDeviceType
} else if index == 1 {
viewController = self.storyboard!.instantiateViewControllerWithIdentifier("ProgramsPage") as ProgramsViewController
} else if index == 2 {
viewController = self.storyboard!.instantiateViewControllerWithIdentifier("LiveTVPage") as LiveTVViewController
} else if index == 3 {
viewController = self.storyboard!.instantiateViewControllerWithIdentifier("AboutPage") as AboutViewController
} else {
viewController = self.storyboard!.instantiateViewControllerWithIdentifier("HomePage") as HomeViewController
}
return viewController
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
非常感谢你,抱歉我的英语不好
答案 0 :(得分:0)
您应该采用MVC设计模式。这将允许您存储您在模型中下载所需的数据。然后,当加载某个视图控制器时,您只需询问该模型是否存在该数据。如果确实如此,你会得到它。否则,您可以照常下载。
进一步解释:
模型 - 视图 - 控制器(MVC)设计模式为应用程序中的对象分配三个角色之一:模型,视图或控制器。该模式不仅定义了对象在应用程序中扮演的角色,还定义了对象彼此通信的方式。
模型对象封装特定于应用程序的数据,并定义操作和处理该数据的逻辑和计算。例如,模型对象可能表示游戏中的角色或地址簿中的联系人。模型对象可以与其他模型对象具有一对多的关系,因此有时应用程序的模型层实际上是一个或多个对象图。作为应用程序持久状态的一部分的大部分数据(无论持久状态是存储在文件还是数据库中)都应该在数据加载到应用程序后驻留在模型对象中。因为模型对象代表与特定问题域相关的知识和专业知识,所以它们可以在类似的问题域中重用。理想情况下,模型对象应该没有与呈现其数据的视图对象的显式连接,并允许用户编辑该数据 - 它不应该关注用户界面和表示问题。
视图层中用于创建或修改数据的用户操作通过控制器对象进行通信,从而导致创建或更新模型对象。当模型对象发生更改时(例如,通过网络连接接收新数据),它会通知控制器对象,该对象会更新相应的视图对象
以上引用来自我在第一段中提到的链接。
答案 1 :(得分:0)
您错误地在viewControllerForSegmentIndex(index: Int)
中实例化了新的视图控制器。
每次切换回来时,为避免实例化每个视图控制器,应该做的是将属性修改为:
private let homeViewController: HomeViewController = self.storyboard!.instantiateViewControllerWithIdentifier("HomePage") as HomeViewController
private let aboutViewController: AboutViewController = self.storyboard!.instantiateViewControllerWithIdentifier("AboutPage") as AboutViewController
private let liveTVViewController: LiveTVViewController = self.storyboard!.instantiateViewControllerWithIdentifier("LiveTVPage") as LiveTVViewController
private let programsViewController: ProgramsViewController = self.storyboard!.instantiateViewControllerWithIdentifier("ProgramsPage") as ProgramsViewController
并将viewControllerForSegmentIndex(index: Int)
更改为:
func viewControllerForSegmentIndex(index: Int) -> UIViewController {
var viewController: UIViewController
switch index {
case 0:
return homeViewController
case 1:
return programsViewController
case 2:
return liveTVViewController
case 3:
return aboutViewController
default:
return homeViewController
}
}