PresentViewController de TableCell personalizado en xib

Creé el TableView Controller personalizado, dentro de la celda coloqué un botón para abrir la biblioteca de fotos del dispositivo. Mi problema, no puedo abrir imagePickerController desde CustomCell.m, muestra el siguiente error. enter image description here

Por favor, dame una idea para arreglar mi problema.

TableViewCell es una vista, no se puede present en vistas, en cambio UIViewController puede manejarlo. Debe transferir el control de su celda a su controlador que contiene tableview y crear una celda personalizada para él.

Pruebe de esta manera:

Custom Cell .h Class:

 @protocol changePictureProtocol  -(void)loadNewScreen:(UIViewController *)controller; @end @property (nonatomic, retain) id delegate; 

Luego sintetízalo Synthesize it in .m.

Agregue esto en el archivo m :

 -(IBAction)changePicture:(id)sender { // ..... blah blah [self.delegate loadNewScreen:picker]; } 

El controlador de vista que carga esta celda:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // create cell here cell.delegate = self; } -(void)loadNewScreen:(UIViewController *)controller; { [self presentViewController:controller animated:YES completion:nil]; } 

Es un psuedocode para darte una idea.

EDITAR:

Swift equivalente:

Código CustomTableViewCell.swift :

 protocol ChangePictureProtocol : NSObjectProtocol { func loadNewScreen(controller: UIViewController) -> Void; } class CustomTableViewCell: UITableViewCell { // Rest of the class stuff weak var delegate: ChangePictureProtocol? @IBAction func changePicture(sender: AnyObject)->Void { var pickerVC = UIImagePickerController(); if((delegate?.respondsToSelector("loadNewScreen:")) != nil) { delegate?.loadNewScreen(pickerVC); } } } 

Código ViewController.swift :

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier") as CustomTableViewCell! cell.delegate = self; return cell; } func loadNewScreen(controller: UIViewController) { self.presentViewController(controller, animated: true) { () -> Void in }; } 

Las respuestas que proponen un delegado o una variable de instancia son correctas, pero, sin embargo, en la mayoría de los casos no es importante usar un controlador de vista especial para presentar el nuevo controlador. En estos casos, la siguiente solución es mucho más simple: solo use el controlador de vista de aplicaciones raíz:

 UIViewController* activeVC = [UIApplication sharedApplication].keyWindow.rootViewController; [activeVC presentViewController:'new view controller' animated:YES completion:NULL]; 

presentViewController: mensaje está ahí para Viewcontroller. Delegue el control de Cell para viewController y use la misma línea para resolver su problema. UITableViewCell no responde a presentViewController: mensaje.

Necesita un UIViewController para presentar desde. Hay algunas cosas que puedes hacer aquí. Una sería crear un protocolo de delegado personalizado con un método de callback changePicturePressed . Luego puede asignar el controlador de vista que contiene como delegado y realizar la presentación en el método de delegado.

La otra cosa que puede hacer es pasar el UIViewController a su celda durante la inicialización y configurarlo como una propiedad débil. Luego puede realizar la presentación directamente desde el interior de la celda utilizando esa propiedad.

Haga IBOutlet de su botón

Luego en cellForRowAtIndexPath dale al objective al botón

 CustomCell *customCell=[tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; [customCell.yourButton addTarget:self action:@selector(yourButtonAction:) forControlEvents:UIControlEventTouchUpInside]; 

Otra forma de hacerlo es pasar la referencia del controlador de CustomCell a CustomCell y usarlo para presentar el nuevo controlador.

Rápido:

CustomCell.swift :

 class CustomTableViewCell: UITableViewCell { // Rest of the class stuff var parentViewController: UIViewController? = nil gotoNewControllerBtn.addTarget(self, action: #selector(gotoNewController), for: .touchUpInside) func gotoNewController() { let newViewController = NewViewController() parentViewController.present(newViewController, animated: true, completion: nil) } } 

ViewController.swift :

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier") as CustomTableViewCell! cell.parentViewController = self; return cell; } 

Necesita viewcontroller para presentar la vista. No puede presentar viewcontroller en tableviewcells.