ios - Error de aserción en dequeueReusableCellWithIdentifier: forIndexPath:
objective-c uitableview (20)
Solución Swift 2.0:
Debe ingresar a su inspector de atributos y agregar un nombre para su identificador de celdas:
Entonces necesitas hacer que tu identificador coincida con tu salida de cola como esto:
let cell2 = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCell
Alternativamente
Si está trabajando con una pluma, es posible que deba registrar su clase en su cellForRowAtIndexPath:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SwitchCell")
// included for context
let cell = tableView.dequeueReusableCellWithIdentifier("SwitchCell", forIndexPath:indexPath) as! SwitchCell
//... continue
}
La referencia de clase UITableView de Apples dice:
Antes de encolar cualquier celda, llame a este método o a registerNib: forCellReuseIdentifier: método para indicar a la vista de tabla cómo crear nuevas celdas. Si una celda del tipo especificado no está actualmente en una cola de reutilización, la vista de tabla utiliza la información proporcionada para crear un nuevo objeto de celda automáticamente.
Si anteriormente registró una clase o un archivo de plumilla con el mismo identificador de reutilización, la clase que especifique en el parámetro cellClass reemplaza la entrada anterior. Puede especificar nil para cellClass si desea anular el registro de la clase del identificador de reutilización especificado.
Aquí está el código del framework Apples Swift 2.0:
// Beginning in iOS 6, clients can register a nib or class for each cell.
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
// Instances returned from the new dequeue method will also be properly sized when they are returned.
@available(iOS 5.0, *)
func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String)
@available(iOS 6.0, *)
func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String)
Así que estaba haciendo un lector de RSS para mi escuela y terminé el código. Corrí la prueba y me dio ese error. Aquí está el código al que se refiere:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
if (cell == nil) {
cell =
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:CellIdentifier];
}
Aquí está el error en la salida:
2012-10-04 20: 13: 05.356 Reader [4390: c07] * Error de aserción en - [UITableView dequeueReusableCellWithIdentifier: forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m.m446 2012-10-04 20: 13: 05.357 Reader [4390: c07] * Aplicación de terminación debido a la excepción no detectada ''NSInternalInconsistencyException'', razón: ''no se puede quitar la cola de una celda con el identificador de la celda - debe registrar una punta o una clase para el identificador o conectar un prototipo de celda en un guión gráfico ''* pila Primera llamada tiro: (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0 0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34 0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7 0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935) libc ++ abi.dylib: termina llamado al lanzar una excepción
Y aquí está el código que muestra en la pantalla de error:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
¡por favor ayuda!
Asegúrese de que el identificador CellIdentifier == de la celda en un guión gráfico, ambos nombres sean iguales. Espero que esto funcione para ti
Aunque esta pregunta es bastante antigua, existe otra posibilidad: si está utilizando Storyboards, simplemente tiene que configurar el identificador de celda en el Storyboard.
Entonces, si su identificador de celda es "Célula", simplemente configure la propiedad "Identificador":
Asegúrese de limpiar su construcción después de hacerlo. XCode a veces tiene algunos problemas con las actualizaciones de Storyboard
Configuré todo correctamente en el Guión gráfico e hice una compilación limpia, pero seguí recibiendo el error " debo registrar una punta o una clase para el identificador o conectar una célula prototipo en un guión gráfico "
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
Corregí el error pero todavía estoy perdido. No estoy usando una ''celda personalizada'', solo una vista con una vista de tabla incrustada. He declarado el controlador de vista como delegado y fuente de datos y me he asegurado de que el identificador de celda coincida en el archivo. ¿Que está pasando aqui?
Creo que este error se trata de registrar su punta o clase para el identificador.
Para que pueda mantener lo que está haciendo en su tableView: cellForRowAtIndexPath y simplemente agregue el código a continuación en su viewDidLoad:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
Ha funcionado para mí. Espero que pueda ayudar.
En Swift, este problema se puede resolver agregando el siguiente código en su
viewDidLoad
método.
tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier")
En mi caso, el bloqueo ocurrió cuando llamé a deselectRowAtIndexPath:
La línea era [tableView deselectRowAtIndexPath:indexPath animated:YES];
Cambiándolo a [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
¡ARREGLADO MI PROBLEMA!
Espero que esto ayude a cualquiera
En su guión gráfico debe configurar el ''Identificador'' de su celda prototipo para que sea el mismo que su "Célula" CellReuseIdentifier. Entonces no recibirá ese mensaje o no necesitará llamar a esa función registerClass :.
Estás utilizando el dequeueReusableCellWithIdentifier:forIndexPath:
La documentation para ese método dice esto:
Importante: debe registrar un archivo de clase o nib utilizando el método
registerNib:forCellReuseIdentifier:
oregisterClass:forCellReuseIdentifier:
antes de llamar a este método.
No registró una pluma o una clase para el identificador de reutilización "Cell"
.
Mirando tu código, parece que esperas que el método de salida a cola devuelva nil
si no tiene una celda para darte. Necesitas usar el dequeueReusableCellWithIdentifier:
para ese comportamiento:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
Observe que dequeueReusableCellWithIdentifier:
y dequeueReusableCellWithIdentifier:forIndexPath:
son métodos diferentes. Ver doc para el primero y el segundo .
Si desea comprender por qué querría usar dequeueReusableCellWithIdentifier:forIndexPath:
consulte esta P&R .
Esto puede parecer estúpido para algunas personas pero me atrapó. Recibía este error y el problema para mí era que estaba tratando de usar celdas estáticas pero luego agregaba dinámicamente más cosas. Si está llamando a este método, sus células deben ser prototipos dinámicos. Seleccione la celda en el guión gráfico y debajo del inspector de atributos, lo primero que dice ''Contenido'' y debe seleccionar los prototipos dinámicos no estáticos.
FWIW, recibí el mismo error cuando olvidé configurar el identificador de celda en el guión gráfico. Si este es su problema, en el guión gráfico, haga clic en la celda de vista de tabla y configure el identificador de celda en el editor de atributos. Asegúrese de que el identificador de celda que establezca aquí sea el mismo que
static NSString *CellIdentifier = @"YourCellIdenifier";
Lo más probable es que el problema se UITableViewCell
que configura el UITableViewCell
personalizado en el guión gráfico, pero no usa el guión gráfico para crear una instancia de su UITableViewController
que utiliza este UITableViewCell
. Por ejemplo, en MainStoryboard, tiene una subclase UITableViewController
llamada MyTableViewController
y tiene un UITableViewCell
dinámico personalizado llamado MyTableViewCell
con identificador id "MyCell".
Si creas tu UITableViewController
personalizado como este:
MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];
No registrará automáticamente su tableviewcell personalizado para usted. Tienes que registrarlo manualmente.
Pero si usas el guión gráfico para crear MyTableViewController
instancia de MyTableViewController
, así:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyTableViewController *myTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyTableViewController"];
¡Qué bueno pasa! UITableViewController
registrará automáticamente su celda de vista de tabla personalizada que defina en el guión gráfico para usted.
En su método delegado "cellForRowAtIndexPath", puede crear su celda de vista de tabla como esta:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//Configure your cell here ...
return cell;
}
dequeueReusableCellWithIdentifier creará automáticamente una nueva celda para usted si no hay una celda reutilizable disponible en la cola de reciclaje.
¡Entonces has terminado!
Pasé horas anoche resolviendo por qué mi tabla generada mediante programación se bloqueó en [myTable setDataSource: self]; Estaba bien comentar y abrir una tabla vacía, pero se bloqueaba cada vez que intentaba llegar a la fuente de datos;
Tenía la delegación configurada en el archivo h: @interface myViewController: UIViewController
Tuve el código fuente de datos en mi implementación y todavía BOOM! GRACIAS a "xxd" (nr. 9): ¡agregar esa línea de código lo resolvió por mí! De hecho, estoy lanzando una tabla desde un botón IBAction, así que aquí está mi código completo:
- (IBAction)tapButton:(id)sender {
UIViewController* popoverContent = [[UIViewController alloc]init];
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
popoverView.backgroundColor = [UIColor greenColor];
popoverContent.view = popoverView;
//Add the table
UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 300) style:UITableViewStylePlain];
// NEXT THE LINE THAT SAVED MY SANITY Without it the program built OK, but crashed when tapping the button!
[table registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
table.delegate=self;
[table setDataSource:self];
[popoverView addSubview:table];
popoverContent.contentSizeForViewInPopover =
CGSizeMake(200, 300);
//create a popover controller
popoverController3 = [[UIPopoverController alloc]
initWithContentViewController:popoverContent];
CGRect popRect = CGRectMake(self.tapButton.frame.origin.x,
self.tapButton.frame.origin.y,
self.tapButton.frame.size.width,
self.tapButton.frame.size.height);
[popoverController3 presentPopoverFromRect:popRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
#Table view data source in same m file
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog(@"Sections in table");
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"Rows in table");
// Return the number of rows in the section.
return myArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSString *myValue;
//This is just some test array I created:
myValue=[myArray objectAtIndex:indexPath.row];
cell.textLabel.text=myValue;
UIFont *myFont = [ UIFont fontWithName: @"Arial" size: 12.0 ];
cell.textLabel.font = myFont;
return cell;
}
Por cierto: el botón debe estar vinculado como IBAction y como IBOutlet si desea anclar el popover a él.
UIPopoverController * popoverController3 se declara en el archivo H directamente después de @interface entre {}
Si va con celdas estáticas personalizadas, simplemente comente este método:
//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// static NSString *CellIdentifier = @"notificationCell";
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// return cell;
//}
y asigne un identificador a las celdas en "Inspector de atributos" en el guión gráfico.
Solo dequeueReusableCellWithIdentifier:forIndexPath:
que Xcode 4.5 incluye el nuevo dequeueReusableCellWithIdentifier:forIndexPath:
en su código de plantilla predeterminado: un potencial para los desarrolladores que esperan el antiguo método dequeueReusableCellWithIdentifier:
Te doy la respuesta tanto en el Objetivo C como en Swift. Antes de eso quiero decir
Si usamos el
dequeueReusableCellWithIdentifier:forIndexPath:
debemos registrar un archivo de clase o nib usando el registerNib: forCellReuseIdentifier: o registerClass: forCellReuseIdentifier: el método antes de llamar a este método como dice Apple Documnetation
Así que agregamos registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:
Una vez que registramos una clase para el identificador especificado y se debe crear una nueva celda, este método inicializa la celda llamando a su método initWithStyle: reuseIdentifier :. Para celdas basadas en plumillas, este método carga el objeto de celda del archivo de plumillas provisto. Si una celda existente estaba disponible para su reutilización, este método llama al método prepareForReuse de la celda.
En el método viewDidLoad deberíamos registrar la celda.
C objetivo
OPCIÓN 1:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
OPCION 2:
[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"cell"];
en el código anterior nibWithNibName:@"CustomCell"
proporcione su nombre de plumilla en lugar de mi nombre de plumilla CustomCell
RÁPIDO
OPCIÓN 1:
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
OPCION 2:
tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell")
en el código anterior nibName:"NameInput"
el nombre de su plumilla
Trabajando con Swift 3.0:
override func viewDidLoad() {
super.viewDidLoad()
self.myList.register(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = myList.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as! MyTableViewCell
return cell
}
Tuve el mismo problema al reemplazar con
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell==nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
resuelto
Tuve el mismo problema, tenía el mismo error y para mí funcionó así:
[self.tableView registerNib:[UINib nibWithNibName:CELL_NIB_HERE bundle: nil] forCellReuseIdentifier:CELL_IDENTIFIER_HERE];
Tal vez sea útil para otra persona.