【问题标题】:How can I access data from a container view from the parent view controller in swift?如何快速从父视图控制器访问容器视图中的数据?
【发布时间】:2018-05-04 19:38:26
【问题描述】:

我有一个视图控制器(SignUpController),它在顶部有 1 个图像视图,在底部有 2 个按钮,还有 1 个视图为 container view。 Container 视图(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

    }  
}

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

【问题讨论】:

  • @Swifty 家伙,为什么你需要一个不同的文本字段控制器类,而不是只在 SignUpController 中做呢?
  • 尝试使用 tv.fullname、tv.Email,不确定只是检查一下,我认为您可以访问这些属性。
  • 因为我只需要中间的许多字段的滚动视图。 @Tushar Sharma
  • 它没有用。虽然它需要但不显示任何值。 @Morshed Alam
  • @Swiftguy 请检查我的答案是否适合您!

标签: ios swift uicontainerview


【解决方案1】:

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

在容器视图控制器InfoRegisterControllerviewDidAppear 中添加以下代码,此方法将获取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 

应该是这样的:)

【讨论】:

    【解决方案2】:

    有几种方法可以做到这一点。您可以在父视图控制器中使用“委托”和“协议”或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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2014-02-10
      • 1970-01-01
      • 2017-12-27
      • 2012-10-26
      • 2021-10-06
      相关资源
      最近更新 更多