使用SegmentedControl更改ViewController而不破坏它

时间:2014-12-16 16:08:02

标签: ios xcode swift uisegmentedcontrol

我有几个控制器。出于某种原因,我使用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()
    }

}

非常感谢你,抱歉我的英语不好

2 个答案:

答案 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
    }
}