Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从swift中的父视图控制器访问容器视图中的数据?_Ios_Swift_Uicontainerview - Fatal编程技术网

Ios 如何从swift中的父视图控制器访问容器视图中的数据?

Ios 如何从swift中的父视图控制器访问容器视图中的数据?,ios,swift,uicontainerview,Ios,Swift,Uicontainerview,我有一个视图控制器(SignUpController),它的顶部有一个图像视图,底部有两个按钮,还有一个视图是容器视图。容器视图(InfoRegisterController)包含带有多个文本字段的scrollview。容器视图不包含任何按钮。因此,现在我需要访问父视图控制器中容器视图的文本字段(或者可以说:我需要访问从容器视图到父视图控制器的所有数据),这样我就可以通过单击SignUpController底部的register按钮来注册用户。我无法通过委托和NSUserDefaults解决问题

我有一个视图控制器(
SignUpController
),它的顶部有一个图像视图,底部有两个按钮,还有一个视图是容器视图。容器视图(
InfoRegisterController
)包含带有多个文本字段的
scrollview
。容器视图不包含任何按钮。因此,现在我需要访问父视图控制器中容器视图的文本字段(或者可以说:我需要访问从容器视图到父视图控制器的所有数据),这样我就可以通过单击
SignUpController
底部的register按钮来注册用户。我无法通过委托和
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

    }  
}

在这里,我需要访问所有字段fullName、Email、Password、verifyPassword、address、permanentAddress、currentAddress、DOB、occupation和所有其他内容,以便注册新用户。

有几种方法可以实现这一点。您可以在父视图控制器中使用“委托”和“协议”或
prepareforsgue
方法

var somePropertyYouWantToAccess: NSString?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

  if segue.identifier == "yourChildViewSegueIdentifier" {
       let childVc = segue.destinationViewController as ContainerViewController
        self.somePropertyYouWantToAccess = childVc.firstName
    }
}

有几种方法可以实现这一点。您可以在父视图控制器中使用“委托”和“协议”或
prepareforsgue
方法

var somePropertyYouWantToAccess: NSString?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

  if segue.identifier == "yourChildViewSegueIdentifier" {
       let childVc = segue.destinationViewController as ContainerViewController
        self.somePropertyYouWantToAccess = childVc.firstName
    }
}

要从父视图访问容器视图,您必须将容器视图的引用传递给父视图,然后在父视图控制器中使用它,有很多方法可以做到这一点,下面是其中之一

在容器视图控制器的
InfoRegisterController
viewdide
中添加以下代码,此方法将在要使用的父级中获取
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 

应该是这样:)

要从父级访问容器视图,您必须将容器视图的引用传递给父级,然后在父级视图控制器中使用它,有许多方法可以做到这一点,下面是其中之一

在容器视图控制器的
InfoRegisterController
viewdide
中添加以下代码,此方法将在要使用的父级中获取
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 

应该是这样:)

@Swifty guy为什么你需要一个不同的文本字段控制器类,而不仅仅是在SignUpController中?尝试使用tv.fullname、tv.Email,不确定只是检查一下,我想你可以访问这些属性。因为我只需要一个滚动视图来查看中间的许多字段@Tushar SharmaIt没有工作。虽然需要,但不显示任何值。@咀嚼Alam@Swiftguy请检查我的答案,如果它为你工作@Swifty guy为什么你需要一个不同的文本字段控制器类,而不仅仅是在SignUpController中?尝试使用tv.fullname、tv.Email,不确定只是检查一下,我想你可以访问这些属性。因为我只需要一个中间字段的滚动视图@Tushar SharmaIt没有工作。虽然需要,但不显示任何值。@咀嚼Alam@Swiftguy请检查我的答案,如果它为你工作!