【问题标题】:Swift Reference Variable from Specific Instance of Different Class来自不同类的特定实例的 Swift 引用变量
【发布时间】:2015-05-16 16:46:00
【问题描述】:

总的来说,我是 Swift 和 iOS 的新手。我正在使用 Swift 编写应用程序。这个应用程序有两个文件,ViewController.swiftBTService.swift

ViewController.swift 有一个ViewController 类型为UIViewControllerBTService.swift 有一个BTService 类型为NSObjectCBPeripheralDelegate。我在UIViewController 类中设置了一个滑块,它的值被分配给变量currentValue

现在,我希望能够从 BTService 类中引用 currentValue。我该怎么做呢?我注意到,如果我在 ViewController 文件中定义一个变量 testUIViewController 之前,我可以在其中引用 test BTService。但这对我没有用,因为我无法(据我所知)将滑块值分配给 test,除非 test 在 UIViewController 类中定义。

这是我的 ViewController 和 currentValue 变量定义。

class ViewController: UIViewController {


@IBOutlet var positionLabel: UILabel!
@IBOutlet var positionSlider: UISlider!
@IBOutlet var connectionLabel: UILabel!

@IBAction func sliderValChanged(sender: UISlider) {

    var currentValue = Float(positionSlider.value)

任何帮助将不胜感激!谢谢。

【问题讨论】:

    标签: ios iphone swift uiviewcontroller


    【解决方案1】:

    您可以使用NSUserDefaults 在应用程序中存储数据并在视图控制器之间共享。

    在您给出的示例中,您可以这样存储它:

    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    defaults.setFloat(Float(positionSlider.value), forKey: "sliderValue") // Write to NSUserDefaults
    defaults.synchronize()
    

    然后,当您需要在另一个文件(或这个文件)中访问它时,您只需调用floatForKey

    if let currentValue: Float = defaults.floatForKey("sliderValue") {
        // Access slider value
    } else {
        // Probably not saved
    }
    

    【讨论】:

    • 如果我将行 let currentValue: Float = defaults.floatForKey("sliderValue") 放在 BTService 类中,它无法识别名称“defaults”。我在 ViewController 类中定义了默认值。这是我应该做的吗?
    • @RossM。如果您想从BTService 类访问它,则必须在尝试使用floatForKey 访问它之前在该类中再次定义defaults(只需复制并粘贴第一行)。
    • 好的,行得通!问题是它只显示滑块的初始值,但如果您更改它,它不会用新值更新变量。我能想到如何让它更新的唯一方法是引用 sliderPosition 但这会产生与 NSUserDefaults 方法修复相同的问题。有什么我想念的非常简单的东西吗?
    • @RossM。摆脱对滑块值的所有引用并使用NSUserDefaults 代替它。将第一个代码块放在sliderValChanged 中,以便在滑块更改时更新。
    • "从 NSUserDefaults 返回的值是不可变的,即使您将可变对象设置为值。例如,如果您将可变字符串设置为“MyStringDefault”的值,您稍后使用检索的字符串stringForKey: 将是不可变的。”——来自 swift 文档。我误解了这一点,还是它基本上说我的 NSUserDefaults 不能改变?
    【解决方案2】:

    您的BTService 是 UIViewController 中的属性吗?

    您可以使用键值观察 (KVO)

    在你的 UIViewController 中

    override func viewDidLoad() {
        self.addObserver(self, forKeyPath: "positionSlider.value", options: .New, context: nil)
    }
    
    deinit() {
        self.removeObserver(self, forKeyPath: "positionSlider.value")
    }
    
    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
        if keyPath == "positionSlider.value" {
            // update service property
        }
    }
    

    【讨论】:

    • 它实际上不是一个属性,它是一个单独的类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2017-05-18
    相关资源
    最近更新 更多