![](/img/trans.png)
[英]how can i access a parent view controller's view from a child view controller?
[英]How can I access data from a container view from the parent view controller in swift?
我有一個視圖控制器( SignUpController
),頂部有 1 個圖像視圖,底部有 2 個按鈕,1 個視圖作為container view
。 容器視圖( InfoRegisterController
)包含帶有多個文本字段的scrollview
視圖。 容器視圖不包含任何按鈕。 所以,現在我需要訪問父視圖控制器中容器視圖的文本字段(或者可以說:我需要訪問從容器視圖到父視圖控制器的所有數據),以便我可以通過單擊注冊按鈕來注冊用戶在SignUpController
底部。 我也無法通過委托和NSUserDefaults
解決它。 所以,請幫我在 swift 4 中解決這個問題?
這是父視圖控制器:
import UIKit
import Material
class SignUpController: UIViewController {
@IBOutlet weak var backgroundView: UIView!
@IBOutlet weak var register: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
backgroundView.layer.borderWidth = 1
backgroundView.layer.borderColor = UIColor.blue.cgColor
register.layer.cornerRadius = 5
// Do any additional setup after loading the view.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) // No need for semicolon
let tv: InfoRegisterController = self.childViewControllers[0] as!InfoRegisterController
print("Hello")
//tv.viewWillAppear(true)
}
所有數據都必須訪問這個地方,以便我可以將其發布到服務器。
@IBAction func Register(_ sender: Any) {
}
} // class end
容器視圖:
import UIKit
import Material
class InfoRegisterController: UIViewController, UITextFieldDelegate, UITableViewDelegate,UITableViewDataSource,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
@IBOutlet weak var fullName: TextField!
@IBOutlet weak var Email: ErrorTextField!
@IBOutlet weak var Password: TextField!
@IBOutlet weak var verifyPassword: TextField!
@IBOutlet weak var address: TextField!
@IBOutlet weak var permanentAddress: TextField!
@IBOutlet weak var currentAddress: TextField!
@IBOutlet weak var DOB: TextField!
@IBOutlet weak var occupation: TextField!
@IBOutlet weak var selectGender: TextField!
@IBOutlet weak var identificationType: TextField!
@IBOutlet weak var identificationID: TextField!
@IBOutlet weak var issuedDate: TextField!
@IBOutlet weak var issuedDistrict: TextField!
@IBOutlet weak var licenseNumber: TextField!
@IBOutlet weak var fathersName: TextField!
@IBOutlet weak var grandfathersName: TextField!
@IBOutlet weak var mobileNumber: TextField!
override func viewDidLoad() {
super.viewDidLoad()
self.fullName.delegate = self
self.Email.delegate = self
self.Password.delegate = self
self.verifyPassword.delegate = self
self.address.delegate = self
self.permanentAddress.delegate = self
self.currentAddress.delegate = self
self.DOB.delegate = self
self.occupation.delegate = self
self.identificationID.delegate = self
self.issuedDate.delegate = self
self.issuedDistrict.delegate = self
self.licenseNumber.delegate = self
self.fathersName.delegate = self
self.grandfathersName.delegate = self
self.mobileNumber.delegate = self
}
}
在這里,我需要訪問 SignUpController 的所有字段 fullName、Email、Password、verifyPassword、address、permanentAddress、currentAddress、DOB、occupation 和所有其他字段,以便我可以注冊新用戶。
要從父視圖訪問容器視圖,您必須將容器視圖的引用傳遞給父視圖,然后在父視圖控制器中使用它,有很多方法可以做到這一點,這里是其中之一。
在容器視圖控制器InfoRegisterController
的viewDidAppear
中添加以下代碼,此方法會將InfoRegisterController
的引用獲取到要使用的父級中。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let signUpControllerParent = self.parent as! SignUpController
signUpControllerParent.saveContrainerViewRefference(vc: self)
}
現在在SignUpController
為即將到來的引用添加一個局部變量,以便保存並稍后用於從文本字段中獲取數據。
var infoRegisterRefferenceVC : InfoRegisterController?
在您的父SignUpController
也添加此方法
func saveContrainerViewRefference(vc:InfoRegisterController){
self.infoRegisterRefferenceVC = vc
}
現在,您可以從父級訪問容器視圖中的所有文本字段和方法,例如:
var fullNameTextField = self.infoRegisterRefferenceVC.fullName.text
應該是這樣:)
有幾種方法可以實現這一點。 您可以在父視圖控制器中使用“Delegate”和“Protocol”或prepareForSegue
方法。
var somePropertyYouWantToAccess: NSString?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "yourChildViewSegueIdentifier" {
let childVc = segue.destinationViewController as ContainerViewController
self.somePropertyYouWantToAccess = childVc.firstName
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.