2017-08-09 74 views
0

我试图将创建的用户实例传递到另一个视图控制器。问题是传递的用户取决于用户的类型被选中。我的意思是我创建了许多主类User的子类。例如:Guest,VIP,Child等,当在第一页上创建一个实例时,它就是创建该用户的子类。如果没有将第二个视图控制器用户属性设置为“键入用户”,我无法将我的用户传递给第二个视图控制器。问题是类型用户不具有子类在第二页中具有的所有属性我无法访问子类可能具有的所有属性。这就是例子,我怎么现在有它设置:将不同子类的实例传递给Swift 3中的另一个ViewController

首先屏幕/视图控制器

var entrantData: People? 
var entrantSelected: EntrantType = .none 

@IBAction func generatePass(_ sender: UIButton) { 
    do{ 
switch entrantSelected { 
     case .freechildguest: entrantData = try Child(dateOfBirth: "\(dobTextField.text!)") 
     case .classicguest: entrantData = ClassicGuest() 
     case .maintenance: entrantData = try Maintenance(NameAddress(firstName: firstNameTextField.text, lastName: lastNameTextField.text, streetAddress: streetAddressTextField.text, city: cityTextField.text, state: stateTextField.text, zipCode: zipCodeTextField.text, entrantType: .maintenance)) 
     default: break 
     } 
} catch let error { 
     showAlert(title: "Error", message: "\(error)") 
} 

} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destViewController = segue.destination as? TicketViewController { 
     destViewController.dataFromForm = entrantData 
    } 
} 

第二个屏幕/视图控制器

class TicketViewController: UIViewController { 
var dataFromForm: People? 

所以在第二视图控制器我现在有dataFromForm中的用户数据,但我希望它位于其子类中,以便我可以获取仅在其子类中划分的属性。例如。维护用户具有儿童和classicGuest不具备的firstname属性。

我想我可以创建子类在User超类中使用的所有属性,但是我觉得这样做会破坏创建具有其独特属性的子类的要点。要解决这个问题

回答

0

一种方法是保持People类型的属性上TicketViewController和试图访问只有在一定的子类有一个属性时,尝试有条件下来铸造People实例适当的子类。

这里是你如何能做到这一点的基本示例:

if let vip = dataFromForm as? VIP { 
    //access VIP properties 
} else if let guest = dataFromForm as? Guest { 
    //access guest properties 
} 
+0

当然是这样,如果让设置客人有传票名称默认标签文本,但为维护型我能得到的标签,我可以用使用该用户的名字。非常感谢大卫! –

+0

不用担心,欢迎来到SO!如果您发现我的答案有帮助,请考虑接受它。 –

相关问题