2016-03-06 77 views
0

假设我有一个具有固定布局的应用程序:一个按钮和几个标签。因为我有相同的按钮和标签,所以在整个应用程序中不使用多个视图控制器是有意义的。我不想复制和粘贴它们,因为它们的外观和风格永远不会改变。如果我稍后决定改变它们的外观,我将不得不经历每一个视图控制器,这是一个不好的做法(就像复制和粘贴代码一样)。iOS应用程序的结构

虽然,我希望能够让用户回去转发“布局”的应用程序,但是这个代码没有让我这样做:

class MyViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     enterFirstLayout() 
    } 

    func enterFirstLayout() { 
     // do things such as change labels' text property 
     exitFirstLayout() 
    } 

    func exitFirstLayout() { 
     // do things 
     enterSecondLayout() 
    } 

    func enterSecondLayout() { 
     // ... 
    } 
} 

我能做些什么,以避免产生多个视图控制器,并让用户可以跳过并返回到应用程序的特定布局?

+1

你应该解耦你的应用程序的固定*布局*(演示文稿)与*内容*是呈现。您可以只保留一个视图控制器类,但会使该类的多个实例呈现不同的数据。 – jtbandes

+0

这很有趣,谢谢@jtbandes。如果一个布局与其他布局有些不同,会怎么样?假设我只需要在一种布局中调用一个函数,而不是其他函数。 – Cesare

+0

您提出的问题对于很好的答案太模糊。这可能与你的问题不是100%相关,但我会建议探索[ResearchKit](http://researchkit.org/docs/index.html)的设计,该设计有一个“步骤”和“任务”的概念,可能与你正在做的事情有些相似。 – jtbandes

回答

2

我假设你正在试图实现像向导这样的事情,你可以通过屏幕回到前言。

在这种情况下,我会使用UICollectionViewUICollectionViewFlowLayout。构建一个代表单个“屏幕”布局的自定义单元,而不是将一个简单的数据源构建为一组自定义对象。数据源应该包含所有标签的内容,例如String变量。

不错而优雅的代码。

您可以免费获得滚动动画和滑动手势检测。如果你喜欢,你可以添加你的自定义幻想动画。

这是我的解决方案。回到你的问题,如果你想这样做,你可以例如使用子类。构建基本视图控制器类,并将所有布局配置并将标签公开为只读变量,然后继承此类。请记住,子类化是最紧密的耦合。

其他选项是建立这个视图控制器一次,并重用不同的数据集。

所以决定是你的。我会在1,3,2顺序:)

+0

非常感谢。 'UICollectionView'解决方案看起来很有希望,但是如何在自定义单元之间切换? – Cesare

+0

你会得到免费的滑动手势。如果你愿意,你可以禁用它。要手动触发切换,您可以使用'setContentOffset(_ contentOffset:CGPoint,animated animated:Bool)'并设置'contentOffset.x = numberOfPage * CGRectGetWidth(self.bounds) – psci