Swift:如何重用视图控制器

时间:2017-10-24 20:03:22

标签: ios swift viewcontroller

我正在开发一个简单的自定义转换器应用。 问题是我为每个(!)转换创建了一个单独的视图控制器(华氏度到摄氏度,盎司到千克等等),我想知道如何重新使用一个转换器视图控制器并只需更改在后台进行的计算?

这是我到目前为止所做的:

  • mainVC(包含每个转换器viewController的按钮)
  • (现在是10个)用户可以进行的每次转换的转换器VC
  • MathLib.swift,每个数学公式具有不同的函数

每个转换器VC包含一个名称标签(例如,盎司到千克),一个数字键盘和一个输入/输出标签。当用户触摸数字时,转换将使用MathLib.swift中的正确数学公式动态完成。我只是使用相应的公式返回。这是一个公式的例子:

static func stoneToKilo(stone: Double) -> Double {
        let kilo = stone / 0.15747
        return kilo
    }

现在我要做的就是只有一个(!)转换器VC,并且根据mainVC中按下的按钮,在MathLib中使用了正确的公式,并且标签的名称被更改为正确的转换类型。

  1. 所有按钮都应指向一个VC。现在,当按下按钮并显示视图控制器时,如何检查用户来自哪个按钮?例如按钮名称或标签?

  2. 当我知道按钮名称或标签时,我如何使用它在MathLib.swift中使用正确的公式或更改名称标签?我必须使用开关盒吗?如果是这样:我如何设置开关盒以检查所使用的按钮,然后指向正确的数学函数并更改名称标签?

  3. 简而言之:只使用一个VC,检查哪个按钮将用户带到此VC,然后使用某些东西(切换外壳?)来更改VC上的标签之类的东西,并在library.swift文件中使用正确的功能

    这对我来说非常困难,如果你能帮助我,我会很感激。

2 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。

既然你可以点击哪个按钮,就像你用名字或标签所说的那样(我更喜欢第二个,想想你何时可以用不同的语言提供应用程序,即本地化)。

您的主视图控制器现在应该只包含一个输入和一个按钮,并且可以是屏幕的标题,以了解正在使用的转换。

至于计算(业务逻辑),我建议您定义一个协议,该协议有一个名为convert的方法,它接受一个参数,即用户想要转换的值。

protocol Converter {
    func convert( _ value : Double) -> Double
}

然后创建尽可能多的类来进行转换,让我只举一个例子并尽可能简单地考虑转换器米到公里。

让我们称之为应该实现转换协议的DistanceConverter

class DistanceConverter : Converter {
    func convert( _ value : Double) -> Double {
         return value / 1000.0
    }
}

现在,当你点击第一个名为米的屏幕上的按钮到公里时,在你的处理程序中你会:

1)实例化DistanceConverter的实例。

2)instatiante MainViewController的一个实例。并为它提供您在步骤1中创建的DistanceConverter实例。

3)在mainViewController中保留DistanceConverter作为iVar的引用。

这里的关键点是将它保存在类型为Converter的iVar中,因此它可以保存任何类的所有实例,这些实例将实现您将要创建的Converter协议。

4)在mainViewController的'convert'按钮的处理程序中,你在第3步中创建的mainViewController的iVar上调用方法convert。

现在为了让你创建另一个转换器,让我们说温度转换器将Celcius处理为华氏度,你创建一个新的类:

class TemperatureConverter : Converter {
    func convert( _ value : Double) -> Double {
         // return the calculation, 
    }
}

点击第一个屏幕上的温度按钮: 1)实例化DistanceConverter的实例。 然后像以前一样重复所有剩余的步骤(您可以轻松地重构所有其余步骤)。

这是开箱即用的策略模式,所以我建议您阅读它并使用swift进行应用。

答案 1 :(得分:-1)

您应该将委托传递给发生转换的视图控制器,从而实现您要使用的功能。在推送或显示视图控制器之前实例化视图控制器时,请注入委托。

使用协议方法为要使用的每个方法定义协议,然后让委托通过扩展实现它们。委托甚至可以是允许选择转换类型的ViewController。

然后,您可以使用转换类型定义枚举,并将其传递给新的视图控制器。在视图控制器上只需切换类型并运行正确的委托方法。

Hello sir,

     My name is John, from Sydney. I am trying to contact you for so long 
time. But I did n't get an opportunity to meet you. Please give me an appointment.

     1. My name is John, from Sydney. 

     2. I am trying to contact you for so long time. 

     3. But I didn't get an opportunity to meet you. Please give me an appointment.

                             Thank you

在目标视图控制器上:

enum ConversionType: Int {
    case fahrenheitToCelsius
    // other cases
}

protocol ConversionDelegate {
    func convertToCelsius(fromFahrenheitDegrees fDegrees: Double) → Double
    // other protocol functions
}

// Other protocols here

class SelectionViewController: UIViewController {
    // your usual stuff like viewDidLoad

    func presentConversionViewController(forConversion type: ConversionType) {
        let destinationVC = ... // instantiate your VC from storyboard here
        destinationVC.delegate = self
        destinationVC.conversionType = type
        // present/push your VC
}

extension SelectionViewController: ConversionDelegate {
    func convertToCelsius(fromFahrenheitDegrees fDegrees: Double) → Double {
        // you Math.lib func here
        return (fDegrees - 32) / 1.8 // example
    }
    // implement the other functions
}