2016-10-06 2 views
0

У меня есть подкласс CustomCell, который наследуется от моего родительского класса CreateEvent. Подкласс описывает отдельные ячейки для ячейки представления таблицы, которая находится на контроллере CreateEvent View. В одной конкретной ячейке у меня есть текстовое поле, связанное с файлом CustomCell, но у меня возникает проблема с получением значения из этого текстового поля, когда пользователь входит в текстовое поле. У меня также проблемы с клавиатурой с внешними касаниями и нажатием клавиши возврата, но я в основном сосредоточен на получении текста из текстового поля. Я знаком с выполнением этих функций в обычном быстром файле, но поскольку это подкласс, я не уверен, что делать. То, что я пытался это использовать:Таблица View Cell с текстовым полем

class CustomCell: UITableViewCell, UITextFieldDelegate { 

@IBOutlet weak var entranceFeeTextField: UITextField! 

override func awakeFromNib() { 
    super.awakeFromNib() 

} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 

И:

class CreateEventVC: UIViewController, UITableViewDelegate, UITableViewDataSource, CustomCellDelegate, UITextFieldDelegate { 

override func viewDidLoad() { 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let currentCellDescriptor = getCellDescriptorForIndexPath(indexPath) 
    let cell = tableView.dequeueReusableCell(withIdentifier: currentCellDescriptor["cellIdentifier"] as! String, for: indexPath) as! CustomCell 


    cell.entranceFeeTextField.delegate = self 

    entranceFeeAmount = cell.entranceFeeTextField.text! 
} 

Этот код не работает, и я не совсем уверен, который TextField делегатов мне нужно работать, чтобы быть в состоянии для получения значения Text из текстового поля.

ответ

1

Для получения тонов текстового поля вы можете использовать методы UITextFieldDelegatetextFieldShouldEndEditing(:) или textFieldShouldReturn(:).

, например:

func textFieldShouldEndEditing(textField: UITextField) -> Bool { 
    print("TextField should end editing method called") 
    let textFromCell = textField.text! 
    //do whatever you want with the text! 
    return true; 
} 

В этом фрагменте кода, textField будет на самом деле ваш экземпляр entranceFeeTextField. Потому что где-то, когда это текстовое поле прекращает редактирование, оно вызывает self.delegate?.textFieldShouldEndEditing(entranceFeeTextField), и реализация этого метода находится внутри вашего CreateEventVC.

Возврат true позволит текстовому полю завершить редактирование. Этот метод вызывается только тогда, когда пользователь хочет прекратить редактирование. Поэтому вы должны удалить entranceFeeAmount = cell.entranceFeeTextField.text! из своего метода cellForRowAtIndexPath, потому что именно там вы создаете свою ячейку. В этот момент пользователь не будет входить в ваше текстовое поле, поэтому не нужно получать текст от него, как только он будет создан.

Все, что вам нужно сделать, это реализовать один из этих методов в CreateEventVC.

+0

Это очень полезно. Имеет смысл, что мне нужно сообщить текстовому полю прекратить редактирование, чтобы иметь возможность вытащить значение. Однако в строке «let textFromCell = textField.text!» Он не будет распознавать textField из файла CustomCell. – Kevin

+0

@Kevin, если вы правильно установили делегат, и реализуете этот метод в 'CreateEventVC', да, это будет. Параметр метода говорит 'textField', но это только текстField, передаваемый делегатом. Когда он будет вызван, это будет ваш 'входFeeTextField'. Разве вы не имеете в виду что-то еще? – Zolnoor

+0

Я действительно использовал entryFeeTextField. Должно быть, делегат, что я слишком хорошо согласен. Разве это не «cell.entranceFeeTextField.delegate = self»? Что еще мне нужно для удовлетворения делегата? Спасибо – Kevin

0

Это рабочий код, я получаю значение из текстового поля, и даже клавиатура сбрасывается.

var cell = TableViewCell() // customCell 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     cell = tbl.dequeueReusableCell(withIdentifier: "CELL") as! TableViewCell 
     cell.configure(text: "", placeholder: "EnterText") 
     return cell 
    } 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return 1 
} 

func numberOfSections(in tableView: UITableView) -> Int 
{ 
    return 1 
} 

func textFieldShouldReturn(_ textField: UITextField) -> Bool 
{ 
    //cell = tbl.dequeueReusableCell(withIdentifier: "CELL") as! TableViewCell 


    print(cell.returnTextOfTextField()) 
    print(cell.txtField.text) 
    cell.txtField .resignFirstResponder() 
    return true 
} 




/// Custom cell class 


class TableViewCell: UITableViewCell,UITextFieldDelegate 
{ 

@IBOutlet weak var txtField: UITextField! 
override func awakeFromNib() 
{ 
    super.awakeFromNib() 
    // Initialization code 
} 
public func configure(text: String?, placeholder: String) { 
    txtField.text = text 
    txtField.placeholder = placeholder 

    txtField.accessibilityValue = text 
    txtField.accessibilityLabel = placeholder 
} 

func returnTextOfTextField() -> String 
{ 
    print(txtField.text) 
    return txtField.text! 
} 
override func setSelected(_ selected: Bool, animated: Bool) 
{ 
    super.setSelected(selected, animated: animated) 
    // Configure the view for the selected state 
} 

}

+0

У меня возникают проблемы с кодом 'cell = tbl.dequeueReusableCell (withIdentifier:« CELL ») как! TableViewCell cell.configure (текст: "", placeholder: "EnterText") return cell} '. Появляется много ошибок. Я не уверен, что такое withIdentifier: «CELL» ссылается как на placeholder: «EnterText». – Kevin

+0

добавьте снимок того же самого. TableViewCell - это класс для пользовательской ячейки. Или что я могу сделать, это отправить вам код. Добавьте свой почтовый ящик, выведете код. – Shemona

+0

https://github.com/shemona-ios/stack – Shemona

1
Here is the full code: (Xcode 8 swift 3) 
(View Controller Class) 

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate 
{ 
    @IBOutlet weak var tbl: UITableView! 
    var cell = TableViewCell() 
    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     cell = tbl.dequeueReusableCell(withIdentifier: "CELL") as! TableViewCell 
     cell.configure(text: "", placeholder: "EnterText") 
     return cell 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return 1 
    } 

    func numberOfSections(in tableView: UITableView) -> Int 
    { 
     return 1 
    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool 
    { 


     print(cell.returnTextOfTextField()) 
     print(cell.txtField.text) 
     cell.txtField .resignFirstResponder() 
     return true 
    } 

} 


TableViewCell class (Custom cell): 
class TableViewCell: UITableViewCell,UITextFieldDelegate 
{ 

    @IBOutlet weak var txtField: UITextField! 
    override func awakeFromNib() 
    { 
     super.awakeFromNib() 
     // Initialization code 
    } 
    public func configure(text: String?, placeholder: String) { 
     txtField.text = text 
     txtField.placeholder = placeholder 

     txtField.accessibilityValue = text 
     txtField.accessibilityLabel = placeholder 
    } 

    func returnTextOfTextField() -> String 
    { 
     print(txtField.text) 
     return txtField.text! 
    } 
    override func setSelected(_ selected: Bool, animated: Bool) 
    { 
     super.setSelected(selected, animated: animated) 
     // Configure the view for the selected state 
    } 

} 


"CELL" is the identifier given to cell in Nib . 
+0

Когда я запускаю свой код: cell = tableView.dequeueReusableCell (withIdentifier: "entryFee") как! CustomCell, где entryFee - мой .xib-файл, который содержит текстовое поле, компилятор жалуется на «фатальную ошибку: неожиданно обнаружен нуль при разворачивании необязательного значения» – Kevin

+0

. Пожалуйста, перейдите по ссылке: \t https: // github. ком/Шмона-КСН/стек – Shemona