Как получить доступ к пользовательскому UITableViewCell из основного ViewController - PullRequest
0 голосов
/ 05 июня 2018

У меня есть контроллер основного вида с UITableView.В табличном представлении есть 2 ячейки, прототипированные в IB.

Прототипированные ячейки

Первая ячейка находится в секции 0, а вторая ячейка - в секции 1 (всегда нанижняя часть таблицы).

Вот мое определение таблицы в главном ViewController:

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
    return itemNames.count
    } else {
    return 1
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

// Created additional section where will be the cell for adding items (always at bottom)
    switch indexPath.section {
    case 0:
    let cellIdentifier = "itemCell"
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ItemTableViewCell

    cell.itemNameTextView.text = itemNames[indexPath.row]
    let currentImage = itemImages[indexPath.row]
    cell.itemStateButton.setImage(UIImage(named: currentImage), for: UIControlState.normal)

    return cell

    case 1:
    let cellIdentifier = "addItemCell"
    let addCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ItemTableViewCell

    addCell.addItemButton.setImage(UIImage(named: "plus-math-40"), for: UIControlState.normal)

    return addCell

    default:
    return UITableViewCell()
    }
}

Все выходы для ячеек определены в пользовательском UITableViewCell:

class ItemTableViewCell: UITableViewCell {

@IBOutlet var itemNameTextView: UITextView!
@IBOutlet var itemStateButton: UIButton!
@IBOutlet var addItemButton: UIButton!
@IBOutlet var addTextView: UITextView!

Как я могу получить доступ к значениям (чтение и изменение) переменных выходов в ItemTableViewCell из основного ViewController?

Например, когда во второй ячейке нажата кнопка «+», мне нужно, чтобы TextView стал FirstResponder, изатем сохраните значение TextFiled.

А также мне нужно отредактировать TextFields в ячейках сечения 0 и затем сохранить данные из них.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Вы хотите

  1. Получить события нажатия кнопки в пользовательском UITableViewCell
  2. Изменить значения IBOutlet из основного UIViewController

Во-первыхчтобы получить нажатие кнопки события на объекте ячейки, у вас есть 2 варианта:

1.1 Прикрепить цель при создании экземпляра ячейки:

// In your tableView cellForRow method
addCell.addItemButton.addTarget(self, action: #selector(bringUpTextfieldMethod), for: .touchUpInside)

1.2 Использовать структуру делегата: ItemTableViewCell должен объявить протокол делегата, захватить события нажатия кнопки в этом классе через выход IBAction и передать событие с помощью делегата.Основной ViewController соответствует протоколу и реализует обратный вызов делегата.

Во-вторых - доступ к IBOutlets ячейки.Везде, где вам нужно получить доступ к ячейке:

let indexPath = IndexPath.init(row: 0, section: 0) // Obviously with the correct row/sec
let itemCell = tableView.cellForRowAtIndexPath(indexPath) as! ItemTableViewCell  // your tableview must be an IBOutlet on your view controller

// Now you can access properties on itemCell
// e.g:
let name = itemCell.itemNameTextView.text 
0 голосов
/ 06 июня 2018

Я сделал это с текущей ячейкой, определенной как пользовательский экземпляр ячейки (это код для сохранения данных в CoreData после завершения редактирования TextView в ячейке):

func textViewDidEndEditing(_ textView: UITextView) {

    currentTextView = nil

    // Finished edit tex tin text view. Save new values to CoreData
    let currentCell = tableView.cellForRow(at: currentIndexPath) as! ItemTableViewCell
    if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) {

        // Add Mode. Adding values from addItemCell to CoreData
        if editMode == false {
            // In add mode we need to add a new record to CoreData
            // Check if textview is not empty
            if currentCell.addTextView.text != "" {
            shoppingItem = ItemMO(context: appDelegate.persistentContainer.viewContext)
            shoppingItem.itemName = currentCell.addTextView.text
            shoppingItem.itemCreatedDate = Date()
            shoppingItem.itemDone = false
            currentCell.addTextView.text = ""
            }
        } else {
            // In edit mode we need to save current values and save context
            if currentCell.itemNameTextView.text != "" {
            shoppingItems[currentIndexPath.row].itemName = currentCell.itemNameTextView.text
            }
            }
        appDelegate.saveContext()
        tableView.reloadData()
        }

    }

значение currentIndexPath I'mбрать при начале редактирования ячейки:

func textViewDidBeginEditing(_ textView: UITextView) {

    currentTextView = textView

    var superview = textView.superview
    while let view = superview, !(view is UITableViewCell) {
        superview = view.superview
    }
    guard let cell = superview as? UITableViewCell else {
        //print("button is not contained in a table view cell")
        return
    }
    guard let indexPath = tableView.indexPath(for: cell) else {
        //print("failed to get index path for cell containing button")
        return
    }

    // Setup current index path value
    self.currentIndexPath = indexPath

    // Setup edit mode for data saving in textViewDidEndEditing
    if currentIndexPath.section == 0 {
        editMode = true
    } else {
        if currentIndexPath.section == 1 {
            editMode = false
        }
    }
}
0 голосов
/ 05 июня 2018

Если у вас есть только 2 нет.разделов и по одной строке в каждом разделе, затем вы можете присвоить тегу addItemButton значение, равное номеру раздела.Затем добавьте действие к этой кнопке и определите соответствующий селектор.В этом методе селектора получите значение раздела из тега отправителя и получите путь индекса, соответствующий разделу и строке (= 0).Из этого указателя получите ячейку, и вы сможете получить доступ к любой точке ячейки в главном контроллере.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...