Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 在不公开其类和相关函数的情况下公开var?_Xcode_Swift_Scope_Global Variables_Viewcontroller - Fatal编程技术网

Xcode 在不公开其类和相关函数的情况下公开var?

Xcode 在不公开其类和相关函数的情况下公开var?,xcode,swift,scope,global-variables,viewcontroller,Xcode,Swift,Scope,Global Variables,Viewcontroller,我开始学斯威夫特了 我有一个viewController,它有一个var,需要从外部viewController更新。所以我在声明中添加了public,但是我的代码不会编译,因为我的类是内部的(默认情况下)。因此,我将我的类公开,但它迫使我公开类中的所有函数,包括viewDidLoad、tableView数据源和委托方法。我做错了什么?我不希望其他人调用我控制器的viewDidLoad 我只想让viewControllerA访问viewControllerB内部的var,而不向外界公开viewC

我开始学斯威夫特了

我有一个viewController,它有一个var,需要从外部viewController更新。所以我在声明中添加了public,但是我的代码不会编译,因为我的类是内部的(默认情况下)。因此,我将我的类公开,但它迫使我公开类中的所有函数,包括viewDidLoad、tableView数据源和委托方法。我做错了什么?我不希望其他人调用我控制器的viewDidLoad

我只想让viewControllerA访问viewControllerB内部的var,而不向外界公开viewControllerB内部的每个函数

在ObjC中,通过在headerfile中标记属性readonly并在实现中标记readwrite,可以很容易地实现这一点。在本例中,我将在头文件中保留该属性,以便它可以从外部读写

这里有一些伪代码

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

    override func viewDidLoad() {
            super.viewDidLoad()
}
}
//objC部件

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
myViewController.myTitle = @""; // not available
现在,如果我将myTitle设置为公共变量,则会出现以下错误

为内部类声明公共变量

因此,我将MyViewController设置为公共类

现在我犯了很多错误

必须将方法“tableView(uU2;:numberOfRowsInSection:)”声明为公共 因为它符合公共协议中的要求 “UITableViewDataSource”


下面是我可以想到的两种在视图控制器之间传递变量的解决方案

全局选项 ViewController2.swift

import UIKit

var globalVariable = String()

class ViewController1: UIViewConroller {


}
    class ViewController2: UIViewController {

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

import UIKit

var globalVariable = String()

class ViewController1: UIViewConroller {


}
    class ViewController2: UIViewController {

overload func viewDidLoad() {
        globalVariable = "some string data"
    }
}
现在,您可以全局访问该变量


赛格期权 我认为处理在视图控制器之间来回发送数据的更好方法是使用委托和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)
如果要从第二个视图控制器设置回值,可以使用委托方法,为了尊重此内容的原始作者,我将重定向到他的帖子:


您可以制定一个协议来跨视图控制器保存和访问数据。这里有一个方法

// 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)
    }
}

ViewControllers旨在不了解彼此,解决方法是全局声明变量。(在你的类声明上面)。但是它会成为ViewController1的一部分吗?似乎它在类之外,只是在文件中声明了它。我的真实场景是一个UITableViewCell,其中暴露了一些属性,需要在willDisplayCell方法中填写这些属性。它将是全局的,可用于整个项目。我正在编辑我的文章,还有一个附加选项。谢谢,但我不太喜欢把它变成一个全局变量。我想如果我这样做的话,我最终会得到一堆全局变量,老实说,我认为这个属性应该和那个类绑定在一起。我编辑了我的第一条评论,说在我的项目中,我在UITableViewCell上使用它,所以在segue中传递它不是一个选项(不使用故事板)。我目前的计划是创建一个公共函数,将所有参数作为模型或字典传递,并让UITableViewCell使用该参数填充其单元格。看起来很奇怪,公开一个类迫使我把它的所有函数都变成了publino问题,如果你解决了你的问题,把它作为一个答案贴在这里,我想看看你是怎么做的。谢谢