我开始学习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'
答案 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"
}
}
您现在可以全局访问该变量。
我认为处理视图控制器之间来回传递数据的更好方法是使用委托和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设置值,您可以使用委托方法,尊重此内容的原作者,我会将您重定向到他的帖子: