复杂故事板的多个导航栏颜色

时间:2016-04-09 13:13:39

标签: ios swift

我的故事板/项目中有48个视图控制器。我希望有两种不同类型的导航栏设计。

样式1是导航栏和状态栏,白色和灰色(颜色对问题不重要)

样式2是没有状态栏的导航栏。这是黑色的。

我在app delegate中设置了样式1,并在其中一个视图中设置了样式2。在某种程度上这是有效的,而样式2会覆盖样式1.但是,当我离开视图时,样式2继续覆盖。

我可以显式设置每个视图控制器但是有48个视图和4或5行代码来定义样式似乎效率低下。如果我稍后选择更改样式,则需要编辑48个代码实例。

我的主要经验是使用PHP,如果遇到这种情况,我会根据需要创建一个include语句来引用style1或style2。

我曾尝试在Swift中创建一个函数来调用所需的设计但是我无法使它工作,因为它没有像直接添加它时那样引用UIViewController。我只编写了Swift / Xcode 3个月,所以我可能缺乏知识。

我想找到一个解决方案,在每个视图中我可以调用类似下面的内容(PseudoCode)

override func viewWillAppear(animated: Bool) {
navBarStyle1() or navBarStyle2()
}

我没有包含我的代码来调整颜色,因为我认为这不是答案所必需的。

有效管理此方法的最佳方法是什么?是否有相当于PHP的包含?如果解决方案是一个功能,你能提供一个例子吗?或者可能是解决方案有所不同?

根据要求,这是我的一个视图控制器:

import UIKit

class DeleteMatchViewController: UIViewController {


    var idPass = ""

    // OUTLETS
    @IBOutlet weak var errorMessage: UILabel!
    @IBOutlet weak var information: UILabel!

    // ACTIONS
    @IBAction func deleteMatch(sender: UIBarButtonItem) {


        // connect and delete from server
        // delete from core data
        // load from core data


        let urlParameters = "removed for privacy"
        let status = sendSeverV2("\(apiUrl)/removedforprivacy.php", parameters: urlParameters)

        if status == "OK"
        {

            // DELETESINGLE firstname|David
            myDatabase("Matches",        theCommand: "DELETESINGLE",   theQuery: "userid|\(idPass)")
            myDatabase("Messages",       theCommand: "DELETEMULTIPLE", theQuery: "people|\(userId)-\(idPass)")
            myDatabase("Messagesunsent", theCommand: "DELETEMULTIPLE", theQuery: "people|\(userId)-\(idPass)")
            // core data
            loadMatchesFromCoreData()
            // segue to matches table
            performSegueWithIdentifier("jumpMatches", sender: nil)

        }
        if status == "Error"
        {
          errorMessage.text = "Connection error"
        }


        if status == "Security"
        {
            errorMessage.text = "Authentication error"
            authError = "yes"
        }

    }


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        }


    override func viewWillAppear(animated: Bool) {

        self.navigationController?.navigationBarHidden = false
        self.tabBarController?.tabBar.hidden = true
        errorMessage.text = ""
        information.text = "If you delete this match all messages will be erased and only a future mutual match will all you to contact them again."


    }



}

1 个答案:

答案 0 :(得分:0)

一点点OOP可以在这里走很长的路。

首先,让我们制作一些基本视图控制器:

class GrayStatusBarViewController: UIViewController {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // set up the appearance
    }
}

class BlackStatusBarViewController: UIViewController {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // set up the appearance
    }
}

现在,我们可以为我们想要的每个外观制作其中一个,并且我们可以将任何共享行为移动到我们想要的这些基类中。您的应用程序可能有一个BaseViewController,我刚刚发布的两个类继承自(而不是直接从UIViewController继承)。

然后,您所要做的就是让您的一堆视图控制器根据主题从正确的控制器继承。

class DeleteMatchViewController: GrayStatusBarViewController {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated) // <-- this is super important

        // the rest of the view will appear code for this VC
    }
}

或者,您可以将外观逻辑封装在类中的方法中,就像我之前提到的那样,BaseViewContoller,如下所示:

class BaseViewController: UIViewController {

    func setUpGrayStatusBar() {
        // write that logic
    }

    func setUpBlackStatusBar() {
        // write that logic
    }

    // etc, as many of these as you want
}

现在,您从此类继承并调用适当的方法:

class DeleteMatchViewController: BaseViewController {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        setUpGrayStatusBar()
    }
}

当涉及到应用程序的运行时性能时,这些解决方案与简单的复制和解决方案都不同。将相同的代码粘贴到所有单个视图控制器中。仅仅因为你没有将它粘贴在一个以上的地方并不意味着它不会运行多次。