我已经浏览了有关此主题的所有其他帖子,但它们似乎对我没有帮助。
我有一个 UITabBarController 正在启动两个选项卡。我想将 tab1 中收集的数据传递给 UITabBar ViewController。我正在尝试为此使用委托协议,但是在发送视图控制器中设置委托变量时遇到问题。准备 segue 永远不会被调用。我什至无法在选项卡栏控制器的 ViewDidLoad() 内循环浏览选项卡的视图控制器,因为它们尚未创建并且为零。
我以前使用过代表,这似乎很简单。我在标签栏中使用它有关系吗?
当我运行代码时,调用了TabBarViewController中的viewDidLoad(),但没有调用准备segue。
在密视控制器中调用 IBAction donePress,但未调用委托,因为它未设置。
这是代码——
protocol DetailsDelegate: class {
func myDetailsGathered( myDetails: MyDetails )
}
/// RECEIVING VIEW CONTROLLER
class TabBarViewController: UITabBarController, DetailsDelegate
{
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
print("prepare for segue calledn");
if let destinationViewController = segue.destination as? MeViewController
{
destinationViewController.delegate = self
}
}
override func viewDidLoad()
{
print("ViewDidLoad Called n")
}
func myDetailsGathered(myDetails: MyDetails)
{
self.myDetails = myDetails
print("My details gathered n")
}
}
---------------
/// SENDING VIEW CONTROLLER
class MeViewController: UIViewController
{
weak var delegate: DetailsDelegate?
override func viewDidLoad()
{
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
// I have UIButton in the view and this is invoked when its pressed.
@IBAction func donePressed(_ sender: Any)
{
var infoToPass = MyDetails()
print("looks like we are done")
delegate?.myDetailsGathered(infoToPass: myDetails)
}
}
segue 时会调用prepareForSegue
。你不这样做,这就是为什么它不会被调用。
segue 定义了 应用的情节提要文件。
应使用 singleton
类来存储变量并在不同的控制器之间访问它们。你声明一个这样的:
class Singleton {
static let sharedInstance = Singleton()
var name = ""
}
分配给单一实例:
Singleton.sharedInstance.name = "Some name"
要从任何控制器读取数据:
let name = Singleton.sharedInstance.name
首先,为什么您希望标签栏控制器接收一些信息/数据?
准备 segue 永远不会被调用。
prepareForSegue
方法将在performSegue
之后立即调用。那么你performSegue
方法在哪里?或者你确定正在执行那种segue
MeViewController
?
您拥有的另一个选择是使用 NotificationCenter
.