swift - 从 UICollectionViewCell 调用函数以在 UICollectionView 中使用

标签 swift uicollectionview uicollectionviewcell

我有一个创建一堆文本字段的 UICollectionViewCell 和一个查看在单元格中创建的所有文本字段并将它们写入 firebase 的函数 (handleNewJob)。

但是,我想要的是我在 UICollectionView 中创建的按钮,用于从 UICollectionViewCell 调用函数 (handleNewJob)。

这可能吗?我试过在 UICollectionView 中使用该函数,但我似乎无法引用所有 textfields.text?

这是我在 UICollectionViewCell 中的函数(我没有包括所有文本字段生成,因为它很长):

        // HANDLE NEW JOB
        func handleNewJob(){
            let newJobBrand = jobBrand.text!
            let newJobName = jobName.text!
            let newDirectorName = directorName.text!
            let newAgencyName = agencyName.text!
            let newProdCoName = prodCoName.text!
            // WHERE TO PUT IN DATABASE
            let reference = Database.database().reference().child("jobInfo")
            let childRef = reference.childByAutoId()
            // REFERENCING DICTIONARY
            let jobBrandValue = ["jobBrand": newJobBrand]
            let jobNameValue = ["jobName": newJobName]
            let jobDirectorValue = ["directorName": newDirectorName]
            let jobAgencyNameValue = ["agencyName": newAgencyName]
            let jobProdCoValue = ["prodCoName": newProdCoName]
            // WRITE TO DATABASE
            childRef.updateChildValues(jobBrandValue)
            childRef.updateChildValues(jobNameValue)
            childRef.updateChildValues(jobDirectorValue)
            childRef.updateChildValues(jobAgencyNameValue)
            childRef.updateChildValues(jobProdCoValue)
        }

这是我的 UICollectionView 代码 - 我想调用 handleNext 按钮下的函数:

          import UIKit
      import Firebase

      class page_newJobSwipingController : UICollectionViewController, UICollectionViewDelegateFlowLayout, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

          // VARIABLES
          var ref:DatabaseReference?

              // BOTTOM BUTTONS
          private let previousButton: UIButton = {
              let button = UIButton(type: .system)
              button.setTitle("Previous", for: .normal)
              button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
              button.setTitleColor(.gray, for: .normal)
              button.addTarget(self, action: #selector(handlePrev), for: .touchUpInside)
              button.translatesAutoresizingMaskIntoConstraints = false
              return button
          }()
          private let nextButton: UIButton = {
              let button = UIButton(type: .system)
              button.setTitle("Next", for: .normal)
              button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
              let pinkColour = UIColor(red: 232/255, green: 68/266, blue: 133/255, alpha: 1)
              button.setTitleColor(.mainPink, for: .normal)
              button.translatesAutoresizingMaskIntoConstraints = false
              button.addTarget(self, action: #selector(handleNext), for: .touchUpInside)
              return button
          }()

              // SET UP NEXT AND PREVIOUS BUTTONS TO HAVE A FUNCTION
          @IBAction func handlePrev(sender : UIButton) {
              let prevIndex = max(pageControl.currentPage - 1, 0)
              pageControl.currentPage = prevIndex
              let indexPath = IndexPath(item: prevIndex, section: 0)
              collectionView?.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
          }
          @IBAction func handleNext(sender : UIButton) {
              let nextIndex = pageControl.currentPage + 1
              pageControl.currentPage = nextIndex
              if nextIndex == 1 {
                  print ("move to page 2")
              } else {
                  print ("send alert message")
                  newJobCellGeneral.handleNewJob()
                  storyboardAlert()
              }

              let indexPath = IndexPath(item: 1, section: 0)
              collectionView?.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
          }

          // HANDLE UPLOAD STORYBOARD OPTIONS
          @IBAction func storyboardAlert() {

              let imagePickerController = UIImagePickerController()
              imagePickerController.delegate = self
              // ACTION SHEET FOR ADDING NEW ATTACHMENT
              let alert = UIAlertController(title: "Job Created", message: "Do you want to upload storyboard cells now?", preferredStyle: .actionSheet)
              alert.addAction(UIAlertAction(title: "Now", style: .default, handler: { (action:UIAlertAction) in
                  let storyboardUpload = page_newJobStoryboardUpload()
                  self.show(storyboardUpload, sender: self)
              }))
              alert.addAction(UIAlertAction(title: "Later", style: .default, handler: { (action:UIAlertAction) in
                  let jobList = page_jobList()
                  self.show(jobList, sender: self)
              }))
              alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
              self.present(alert, animated: true, completion: nil)
          }

              // PAGE CONTROL
          private let pageControl: UIPageControl = {
              let pc = UIPageControl()
              pc.numberOfPages = 2
              pc.currentPageIndicatorTintColor = .mainPink
              pc.pageIndicatorTintColor = UIColor(red: 249/255, green: 207/266, blue: 224/255, alpha: 1)
              return pc
          }()
          override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
              let x = targetContentOffset.pointee.x
              pageControl.currentPage = Int(x / view.frame.width)
          }
              // CONSTRAINTS OF BOTTOM CONTROLS
          fileprivate func setupBottomControls(){
              let bottomControlsStackView = UIStackView(arrangedSubviews: [previousButton, pageControl, nextButton])

              bottomControlsStackView.translatesAutoresizingMaskIntoConstraints = false
              bottomControlsStackView.distribution = .fillEqually
              view.addSubview(bottomControlsStackView)

              NSLayoutConstraint.activate([
                  bottomControlsStackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
                  bottomControlsStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                  bottomControlsStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                  bottomControlsStackView.heightAnchor.constraint(equalToConstant: 50)
                  ])
          }

          // SUPER VIEW DID LOAD
          override func viewDidLoad() {
              super.viewDidLoad()

              collectionView?.backgroundColor = .white
              collectionView?.register(newJobCellGeneral.self, forCellWithReuseIdentifier: "newJobCellGeneral")
              collectionView?.register(newJobCellTechnical.self, forCellWithReuseIdentifier: "newJobCellTechnical")
              collectionView?.isPagingEnabled = true

              setupBottomControls()

          }
          func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
              return 0
          }
          override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
              return 2
          }
          override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

              if indexPath.item == 0 {

                  let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "newJobCellGeneral", for: indexPath) as! newJobCellGeneral
                  navigationItem.title = "General Info"
                  return cell
              } else {
                  let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "newJobCellTechnical", for: indexPath) as! newJobCellTechnical
                  navigationItem.title = "Technical Specs"
                  return cell
              }
          }
          func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
              return CGSize(width: view.frame.width, height: view.frame.height)
          }
      }

最佳答案

流程是相反的,但是,最简单的方法是通过通知 在你的收藏 View 中

将其放入您的 collectionView 按钮按下方法

NotificationCenter.default.post(name: Notification.Name("handleNewJob"), object: nil)

在您的 Collection View 单元格中添加观察者(取决于 init 或 awakeFromNib)

NotificationCenter.default.addObserver(self, selector: #selector(handleNewJob, name: NSNotification.Name(rawValue: "handleNewJob"), object: nil)

关于swift - 从 UICollectionViewCell 调用函数以在 UICollectionView 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48831386/

相关文章:

swift - 循环我的代码以便用户可以继续玩

ios - 如何在后台为 Firebase 实时数据库设置值?

ios - 使用 Realm Swift 计算嵌套对象的出现次数

ios - 以编程方式在 UICollectionViewController 的单元格内设置 UIView subview 的高度?

ios - 在实例化 pageViewController 之前如何运行查询并填充数组

ios - 多次调用 UICollectionView viewForSupplementaryElementOfKind

ios - 将资源库中的图像加载到 UICollectionView

swift 2 : UICollectionView - is it possible to return cell asynchronously?

ios - 我的 UICollectionViewCell 项为零?

swift - 在 tvOS 中寻找 UICollectionViewCell 的 "Zoom"-effect 事件处理程序