我正在尝试使用 Struct 来传递我从 Facebook Graph 请求中获得的一些变量,例如电子邮件、姓名、性别等。 我已经在“ViewController”中创建了结构(“fbDemographics”)和变量,但是当我尝试调用“SecondViewController”中的结构和变量之一时出现错误(类型“ViewController”没有成员“fbDemographics” ).我以前从未使用过 struct,所以有点困惑为什么我会收到此错误。感谢您的任何想法。两个 View Controller 的代码如下:
class ViewController: UIViewController, FBSDKLoginButtonDelegate {
override func viewDidLoad() {
super.viewDidLoad()
struct fbDemographics {
static var relationship_status: String?
static var gender: String?
static var user_education_history: String?
static var user_location: String?
static var email: String?
static var name: String?
}
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, relationship_status, gender, user_location, user_education_history, email"]).start(completionHandler: { (connection, result, error) -> Void in
if (error == nil){
//let fbDetails = result as! NSDictionary
//print(fbDetails)
if let userDataDict = result as? NSDictionary {
fbDemographics.gender = userDataDict["gender"] as? String
fbDemographics.email = userDataDict["email"] as? String
fbDemographics.name = userDataDict["name"] as? String
fbDemographics.user_location = userDataDict["user_location"] as? String
fbDemographics.user_education_history = userDataDict["user_education_history"] as? String
fbDemographics.relationship_status = userDataDict["relationship_status"] as? String
let myEducation = fbDemographics.user_education_history
let myEmail = fbDemographics.email
let myGender = fbDemographics.gender
let myName = fbDemographics.name
let myStatus = fbDemographics.relationship_status
let myLocation = fbDemographics.user_location
self.performSegue(withIdentifier: "LoginToHome", sender: (Any).self)
}
}
第二个 View Controller
class SecondViewController: UIViewController {
@IBAction func verticalSliderChanged(_ sender: UISlider) {
let currentValue = String(sender.value);
sliderLabel.text = "\(currentValue)"
func viewDidLoad() {
super.viewDidLoad()
***ViewController.fbDemographics.myEmail***
}
}
最佳答案
问题是您定义了struct
inside viewDidLoad
。所以范围仅限于该方法。将其移出 viewDidLoad
,但仍在 ViewController
中,您应该能够从 SecondViewController
访问它。显然,您还必须修复对 myEmail
的引用,因为它称为 email
。此外,在您的 SecondViewController
中,您应该从 verticalSliderChanged
方法中提取 viewDidLoad
实现; viewDidLoad
应该是 SecondViewController
的顶级实例方法,而不是在另一个方法中定义。
不过,这里还有更深层次的问题。与其将 struct
与 static
变量一起使用,不如创建那些简单的实例变量,创建一个 FbDemographics
类型的实例(注意,开始 struct
types with uppercase letter), 然后在 prepare(for:sender:)
中传递这个实例.
例如,传递数据的正确方法是:
- 消除
静态
变量; - 给你的
struct
一个以大写字母开头的名字; - 创建您的
结构
的实例;和 - 将此实例传递给
prepare(for:sender:)
中的目标 View Controller .
例如
struct FbDemographics {
var relationshipStatus: String?
var gender: String?
var userEducationHistory: String?
var userLocation: String?
var email: String?
var name: String?
}
class ViewController: UIViewController {
var demographics: FbDemographics?
override func viewDidLoad() {
super.viewDidLoad()
performRequest() // I actually don't think you should be initiating this in `viewDidLoad` ... perhaps in `viewDidAppear`
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? SecondViewController {
destination.demographics = demographics
}
}
func performRequest() {
FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, relationship_status, gender, user_location, user_education_history, email"]).start { connection, result, error in
guard let userDataDict = result as? NSDictionary, error == nil else {
print("\(error)")
return
}
self.demographics = FbDemographics(
relationshipStatus: userDataDict["relationship_status"] as? String,
gender: userDataDict["gender"] as? String,
userEducationHistory: userDataDict["user_education_history"] as? String,
userLocation: userDataDict["user_location"] as? String,
email: userDataDict["email"] as? String,
name: userDataDict["name"] as? String
)
self.performSegue(withIdentifier: "LoginToHome", sender: self)
}
}
}
然后 SecondViewController 可以:
class SecondViewController: UIViewController {
var demographics: FbDemographics!
override func viewDidLoad() {
super.viewDidLoad()
let value = demographics.email // this should work fine here
}
}
关于swift - 使用 Struct 传递变量 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43823430/