【问题标题】:swift share information between two classes在两个班级之间快速共享信息
【发布时间】:2015-07-21 23:26:28
【问题描述】:
我现在正在开发一个选项卡式视图应用程序,我想知道是否有任何方法可以将信息从我的 FirstViewController.swift 共享到我的 SecondViewController.swift?既然我知道 swift 不支持多类继承,有没有办法可以在我的 SecondViewController 中使用我在 FirstViewController 上的变量和信息?
【问题讨论】:
标签:
swift
class
inheritance
【解决方案1】:
您需要在两个视图控制器上下文之外的模型来存储数据,然后需要一种方法来使用该数据填充这些视图控制器并提供对模型的引用以从视图控制器进行更改。您可以通过创建一个符合UITabBarColtronnerDelegate 的新模型对象来实现这一点,这将允许您在选择视图控制器后访问它。通过将这些关系抽象为协议来保持事物解耦,这样您的实现就可以随着应用程序的扩展而独立变化。
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let applicationModel = ApplicationModel()
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let tabBarController = window?.rootViewController as? UITabBarController {
tabBarController.delegate = applicationModel
}
return true
}
}
protocol TabbedViewControllerDelegate {
var message: String { set get }
}
class ApplicationModel: NSObject, UITabBarControllerDelegate, TabbedViewControllerDelegate {
var message = "Hello World!"
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
if var tabbedViewController = viewController as? TabbedViewController {
tabbedViewController.message = message
tabBarController.delegate = self
}
}
}
protocol TabbedViewController {
var message: String { set get }
var delegate: TabbedViewControllerDelegate? { get set }
}
class FirstViewController: UIViewController, TabbedViewController {
var delegate: TabbedViewControllerDelegate?
var message: String = "" {
didSet {
println( "FirstViewController populated with message: \(message)" )
}
}
@IBAction func buttonPressed( sender: AnyObject? ) {
self.delegate?.message = "Updated message from FirstViewController"
}
}
class SecondViewController: UIViewController, TabbedViewController {
var delegate: TabbedViewControllerDelegate?
var message: String = "" {
didSet {
println( "SecondViewController populated with message: \(message)" )
}
}
@IBAction func buttonPressed( sender: AnyObject? ) {
self.delegate?.message = "Updated message from SecondViewController"
}
}