在不公开类和相关函数的情况下,公开var



我开始学习Swift了。

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

我只想让viewControllerA访问viewControllerB中的一个var,而不将viewControllerB中的每个函数暴露给外界。

在ObjC中,通过在头文件中将属性标记为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作为一个公共var,我会得到这个错误

为内部类声明公共var

所以我将MyViewController作为一个公共类。

现在我得到一堆错误

方法"tableView(_:numberOfRowsInSection:)"必须声明为公共因为它符合公共协议中的要求"UITableViewDataSource">

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

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

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

全局选项

ViewController2.swift

import UIKit
var globalVariable = String()
class ViewController1: UIViewConroller {

}

ViewController2.swift

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)

如果你想从你的第二个视图控制器设置回值,你可以使用委托方法,为了尊重这个内容的原始作者,我会将你重定向到他的帖子:

阅读原帖子的其余部分。

相关内容

  • 没有找到相关文章

最新更新