首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不能使用回调作为完成处理程序在类之间传递数据。

我不能使用回调作为完成处理程序在类之间传递数据。
EN

Stack Overflow用户
提问于 2020-05-17 11:29:52
回答 1查看 85关注 0票数 0

我希望将自定义类中的textField文本传递给ViewController,并在点击BarButtonItem of DatePicker时将其填充到数组中。我使用回调作为完成处理程序,但它捕获了EXC-BAD-ACCESS。是什么导致了这个错误,以及如何将文本传递给我的ViewController?

  • textField的自定义类
代码语言:javascript
复制
class HourDatePicker: UITextField {

    var datePicker =  UIDatePicker()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commominit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commominit()
    }

    func commominit(){
        text = ""
        datePicker.datePickerMode = .dateAndTime
        datePicker.minuteInterval = 30
        datePicker.locale = Locale(identifier: "ja")
        datePicker.addTarget(self, action: #selector(setText), for: .valueChanged)
        setText()
        inputView = datePicker
        inputAccessoryView = customPicker()
     }

    @objc func setText(){
        let f = DateFormatter()
        f.dateStyle = .full
        f.timeStyle = .short
        f.locale = Locale(identifier: "ja")
        textColor = .black
        text = "\(f.string(from: datePicker.date))"

    }
    private func customPicker() -> UIToolbar {
        let toolbar = UIToolbar()
        toolbar.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: 40)
        let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: self, action: nil)
        space.width = 100
        let flexSpaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let todayButtonItem = UIBarButtonItem(title: "today", style: .done, target: self, action: #selector(setToday))
        let selectButtonItem = UIBarButtonItem(title: "select", style: .done, target: self, action: #selector(tellCalenderText))

        let toolbarItem = [space, flexSpaceItem, todayButtonItem, selectButtonItem]
         toolbar.setItems(toolbarItem, animated: true)
        }
        return toolbar
    }

    @objc func tellCalenderText(completion: ((_ titleText: String) -> Void)){
        //I want to pass text here.
        if text != "" {
        guard let titleText = text else {return}
        completion(titleText)
        } else {
            return
        }

    }
  • ViewController
代码语言:javascript
复制
class Calender1ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    private let selectDate = HourDatePicker()
    private var keepDate: [String] = []

    @IBOutlet weak var timeTextView: UITextView!
    @IBOutlet weak var dateText: HourDatePicker!
    @IBOutlet weak var calenderTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.calenderTableView.delegate = self
        self.calenderTableView.dataSource = self

        selectDate.tellCalenderText {[weak self] (titleText) in
            self?.bringDate(title: titleText)
        }


    }

    func bringDate(title: String){

        print("title: \(title)")
        self.keepDate.append(title)
        timeTextView.text.append(contentsOf: "\(title)\n")

    }

谢谢。

这是错误日志。错误日志

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-17 16:18:19

首先,我觉得你有点搞砸了:

代码语言:javascript
复制
private let selectDate = HourDatePicker()

具有:

代码语言:javascript
复制
@IBOutlet weak var dateText: HourDatePicker!

然后利用selectDateviewDidLoad().

试试看。我只做了几处修改,并试图包括足够的评论,以表明这一点。我想您会发现这是一种让您的自定义HourDatePicker类将信息传递回视图控制器的更直接的方法:

代码语言:javascript
复制
class HourDatePicker: UITextField {

    var datePicker =  UIDatePicker()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commominit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commominit()
    }

    func commominit(){
        text = ""
        datePicker.datePickerMode = .dateAndTime
        datePicker.minuteInterval = 30
        datePicker.locale = Locale(identifier: "ja")
        datePicker.addTarget(self, action: #selector(setText), for: .valueChanged)
        setText()
        inputView = datePicker
        inputAccessoryView = customPicker()
    }

    @objc func setToday(){
        datePicker.date = Date()
    }

    @objc func setText(){
        let f = DateFormatter()
        f.dateStyle = .full
        f.timeStyle = .short
        f.locale = Locale(identifier: "ja")
        textColor = .black
        text = "\(f.string(from: datePicker.date))"

    }
    private func customPicker() -> UIToolbar {
        let toolbar = UIToolbar()
        toolbar.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: 40)
        let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: self, action: nil)
        space.width = 100
        let flexSpaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let todayButtonItem = UIBarButtonItem(title: "today", style: .done, target: self, action: #selector(setToday))
        let selectButtonItem = UIBarButtonItem(title: "select", style: .done, target: self, action: #selector(tellCalenderText))

        let toolbarItem = [space, flexSpaceItem, todayButtonItem, selectButtonItem]
        toolbar.setItems(toolbarItem, animated: true)
        return toolbar
    }

    // "callback" closure
    var tellController: ((String) ->())?

    // triggered by "select" bar button tap
    @objc func tellCalenderText() -> Void {
        // get text from self
        guard let t = text else {
            return
        }
        // execute the callback closure
        tellController?(t)
    }

//  @objc func tellCalenderText(completion: ((_ titleText: String) -> Void)){
//      //I want to pass text here.
//      if text != "" {
//          guard let titleText = text else {return}
//          completion(titleText)
//      } else {
//          return
//      }
//
//  }
}

//ViewController
class Calender1ViewController: UIViewController {

    // not needed
    //private let selectDate = HourDatePicker()

    private var keepDate: [String] = []

    // UITextView connected via Storyboard
    @IBOutlet weak var timeTextView: UITextView!

    // UITextField set to HourDatePicker, connected via Storyboard
    @IBOutlet weak var dateText: HourDatePicker!

    @IBOutlet weak var calenderTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // set the callback closure for the HourDatePicker
        dateText.tellController = { [weak self] (titleText) in
            self?.bringDate(title: titleText)
        }

        // not needed
        //selectDate.tellCalenderText {[weak self] (titleText) in
        //  self?.bringDate(title: titleText)
        //}

    }

    func bringDate(title: String){

        print("title: \(title)")
        self.keepDate.append(title)
        timeTextView.text.append(contentsOf: "\(title)\n")

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61851048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档