我开始学习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)
如果你想从你的第二个视图控制器设置回值,你可以使用委托方法,为了尊重这个内容的原始作者,我会将你重定向到他的帖子:
阅读原帖子的其余部分。