Tengo una clase "TextInputCell" que hereda de UITableViewCell y representa un UITableViewCell que contiene un UITextField. Cuando uso esta clase en un controlador de vista para agregar un "TextInputCell" a una fila de un UITableView, configuro el delegado en el controlador de vista en sí, y las funciones de delegado están vacías (además de las declaraciones de retorno), que publicaré a continuación. Cuando ejecuto la aplicación, los campos de texto aparecen exactamente como quiero, y me permiten hacer clic en el campo de texto y aparece el teclado, sin embargo, en el segundo que presiono cualquier tecla del teclado, la aplicación se bloquea. con error Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x110277af0'. Intenté agregar un UITextField normal a una celda sin la clase que hice y obtengo el mismo error. ¿Alguien sabe por qué sucede esto o cómo puedo solucionarlo?

Clase TextInputCell:

//
//  TextInputCell.swift
//  AdminApp
//
//  Created by Cooper Watts on 2016-01-27.
//  Copyright © 2016 DefineYoga. All rights reserved.

//
//  Based on the DatePickerCell.swift Created by Dylan Vann

import Foundation
import UIKit

/**
 * Text Input Cell for table views.
 */
public class TextInputCell: UITableViewCell {

    var textField: UITextField!

    /**
     Creates the TextInputCell

     - parameter style:           A constant indicating a cell style. See UITableViewCellStyle for descriptions of these constants.
     - parameter reuseIdentifier: A string used to identify the cell object if it is to be reused for drawing multiple rows of a table view. Pass nil if the cell object is not to be reused. You should use the same reuse identifier for all cells of the same form.

     - returns: An initialized TextInputCell object or nil if the object could not be created.
     */
    override public init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        setup()
    }

    private func setup() {
        // The InputField overhangs the view slightly to avoid invalid constraints.
        self.clipsToBounds = true

        textField = UITextField(frame: CGRect(x: 0, y: 15, width: self.contentView.frame.size.width - 15.0, height: self.contentView.frame.size.height))

        textField.placeholder = "PlaceHolder"

        textField.autoresizingMask = [.FlexibleRightMargin, .FlexibleLeftMargin, .FlexibleBottomMargin, .FlexibleTopMargin]
        textField.translatesAutoresizingMaskIntoConstraints = true

        self.contentView.addSubview(textField)

    }

    /**
     Needed for initialization from a storyboard.
     - parameter aDecoder: An unarchiver object.
     - returns: An initialized TextInputeCell object or nil if the object could not be created.
     */
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    /**
     Update the placeholder specific to the Input Field
     - Parameter placeholder: the place holder for the input field
     */
    public func updatePlaceHolder(placeholder: String) {
        textField.placeholder = placeholder
    }

}

Y el controlador de vista al asignar delegados y métodos de delegado, etc.

//Configure the Text Input Cells
var clientNameInput = TextInputCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
var invoiceEmailInput = TextInputCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
var invoiceAddressInput = TextInputCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
var amountChargedInput = TextInputCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)

En viewDidLoad ():

clientNameInput.textField.delegate = self
invoiceEmailInput.textField.delegate = self
invoiceAddressInput.textField.delegate = self
amountChargedInput.textField.delegate = self

clientNameInput.updatePlaceHolder(mainOptions[0])
invoiceEmailInput.updatePlaceHolder(mainOptions[1])
invoiceAddressInput.updatePlaceHolder(mainOptions[2])
amountChargedInput.updatePlaceHolder(billingOptions[0])

Y delegar funciones:

/*UITextField Delegate Methods*/

func textFieldDidBeginEditing(textField: UITextField) {
}
func textFieldDidEndEditing(textField: UITextField) {
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    return true;
}
func textFieldShouldClear(textField: UITextField) -> Bool {
    return true;
}
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
    return true;
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return true;
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true;
}

Y agrego TextInputCells a la tabla así:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        //Assigns UIDatePickerView and UIPickerView cells
        if(indexPath.section == 0 && mainOptions[indexPath.row] == mainOptions[0]) {

            return clientNameInput as UITableViewCell

        } else if(indexPath.section == 0 && mainOptions[indexPath.row] == mainOptions[1]) {

            return invoiceEmailInput as UITableViewCell

        } else if(indexPath.section == 0 && mainOptions[indexPath.row] == mainOptions[2]) {

            return invoiceAddressInput as UITableViewCell

        } //etc....
1
coopwatts 29 ene. 2016 a las 22:25

3 respuestas

La mejor respuesta

Resulta que estaba relacionado con un guión gráfico o un archivo .xib dañado. El problema se resolvió eliminando el controlador de la barra de pestañas y creando uno nuevo, con relaciones recién configuradas. La respuesta se encontró aquí.

0
Community 23 may. 2017 a las 10:30

OP dijo:

Se detuvo en la línea: clase AppDelegate: UIResponder, UIApplicationDelegate

AppDelegate crash

Tuve este mismo error y fue porque había intentado implementar un método para manejar la pulsación de la tecla Intro, pero había eliminado la @IBAction que estaba asociada con ella. ibaction Luego, más tarde, cuando ejecuté la aplicación, se bloqueó.

Eliminé la entrada de la interfaz de usuario de acción de IB (que se muestra arriba), la reconstruí y ejecuté y todo funcionó bien.

1
raddevus 22 oct. 2016 a las 17:30

Debería ser fácil ver qué causa este error agregando un punto de interrupción All Exceptions. Deje que la aplicación se bloquee y el depurador se detendrá justo cuando la excepción esté a punto de lanzarse. Podrá ver la línea exacta de código que arroja la excepción y podrá ver el estado de la aplicación utilizando el depurador. Aquí hay un gif que muestra cómo agregar el punto de interrupción: Agregar un punto de interrupción "Todas las excepciones"

1
marosoaie 29 ene. 2016 a las 20:02