创建一个public var而不公开它的类和相关函数?

时间:2015-04-26 18:02:18

标签: xcode swift scope global-variables viewcontroller

我开始学习Swift。

我的viewController有一个需要从外部viewController更新的var。所以我在声明中添加了public,但是我的代码没有编译,因为我的类是内部的(默认情况下)。所以我让我的类公开但后来它迫使我在我的类public中创建所有函数,包括viewDidLoad,tableView dataSource和delegate方法。我究竟做错了什么?我不希望其他人打电话给我的控制器的viewDidLoad。

所有我想viewControllerA访问viewControllerB中的var而不将viewControllerB中的每个函数暴露给外部世界。

在ObjC中,通过在头文件中标记readonly属性并在实现中进行readwrite,可以非常容易地实现这一点。在这种情况下,我会在头文件中使用该属性,以便它可以从外部进行读写。

这里有一些伪代码

    class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
      var myTitle: NSString?

    override func viewDidLoad() {
            super.viewDidLoad()
}
}

// objC part

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
myViewController.myTitle = @""; // not available

现在,如果我将myTitle设为public var,我会收到此错误

  

声明内部类的公共变量

所以我让MyViewController成为一个公共类。

现在我收到一堆错误

  

方法' tableView(_:numberOfRowsInSection:)'必须公开宣布   因为它符合公共协议中的要求   ' UITableViewDataSource'

2 个答案:

答案 0 :(得分:2)

您可以创建一个协议来跨视图控制器保存和访问数据。这是一种方法。

// Make a custom protocol delegate with a method to store the variable. In this case I'll store a boolean.
protocol storeViewControllerBVariableDelegate {
    func storeVariable(data: Bool?)
}

// In your view controller A, assign your custom protocol delegate to it and add the new delegate method.
class viewControllerA: UIViewController, storeViewControllerBVariableDelegate {

    func storeVariable(data: Bool?) {
        self.variableName = data
    }

}

// In your view controller A's prepare for segue, assign the stored variable to view controller B if you wanted to pass it forward and backward between view controllers.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    let viewControllerB = segue.destinationViewController as! viewControllerB

    viewControllerB.variableName = variableName
}

// In your view controller B, initialize a variable and assign it to the delegate.
class viewControllerB: UIViewController {

    var variableName: Bool!
    var delegate: storeViewControllerBVariableDelegate?

    // However you want to save the variable in view controller B, you can do so in an IBAction, viewDidLoad, etc.
    @IBAction func saveVariable(sender: UIButton) {
        delegate?.storeVariable(self.variableName)
    }
}

答案 1 :(得分:0)

我可以考虑在视图控制器之间传递变量的两个解决方案

全球期权

<强> ViewController2.swift

import UIKit

var globalVariable = String()

class ViewController1: UIViewConroller {


}

<强> ViewController2.swift

    class ViewController2: UIViewController {

overload func viewDidLoad() {
        globalVariable = "some string data"
    }
}

您现在可以全局访问该变量。

Segue Option

我认为处理视图控制器之间来回传递数据的更好方法是使用委托和prepare {深入here覆盖的prepareForSegue函数。

您可以像这样声明prepareForSegue函数:

查看控制器1

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if(segue.identifier == "yourIdentifierInStoryboard") {

        var yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.value = yourValue

ViewController 2

class yourNextViewControllerClass {

    var value:Int! // or whatever

您可以通过编程方式调用它

self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

如果您想从第二个View Controller设置值,您可以使用委托方法,尊重此内容的原作者,我会将您重定向到他的帖子:

Read the rest from the original post.