TableviewController委托不返回值

时间:2013-12-06 18:20:00

标签: ios objective-c delegates uitableview

我有一个tableview控制器,它是一个用于请求数据的静态表。当有人选择一行时,它会显示一个新的tableview控制器,其中包含使用模态segue的选项,用户选择一个选项然后按下'hecho'(完成)按钮,该值应返回到第一个表视图控制器,但它只是没有发生。如果我检查委托,它只是说null。我能做错什么? 故事板 enter image description here

第一张表

AgregarCitaTableViewController.h

#import <UIKit/UIKit.h>
#import "SeleccionarPacienteTableViewController.h"

@interface AgregarCitaTableViewController : UITableViewController <SeleccionarPacienteTableViewControllerDelegate>


@end

AgregarCitaTableViewController.m

#import "AgregarCitaTableViewController.h"
#import "SeleccionarPacienteTableViewController.h"

@interface AgregarCitaTableViewController ()
{
    NSDictionary *datosPaciente;
}

@end

@implementation AgregarCitaTableViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)paciente:(NSDictionary *)paciente
{
    datosPaciente = paciente;
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    cell.detailTextLabel.text = [datosPaciente objectForKey:@"nombre"];

}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if( [segue.identifier isEqualToString:@"listaPacientes"] )
    {
        SeleccionarPacienteTableViewController *viewController = segue.destinationViewController;
        viewController.delegate = self;
    }
}

第二张表

SeleccionarPacienteTableViewController.h

@protocol SeleccionarPacienteTableViewControllerDelegate <NSObject>

-(void)paciente:(NSDictionary *)paciente;

@end

@interface SeleccionarPacienteTableViewController : UITableViewController
{
    id delegate;
}

@property(nonatomic,assign)id<SeleccionarPacienteTableViewControllerDelegate> delegate;
@end

SeleccionarPacienteTableViewController.m

#import "SeleccionarPacienteTableViewController.h"

@interface SeleccionarPacienteTableViewController ()
{
    NSMutableArray *todosPacientes;
    NSDictionary *paciente;
    NSInteger checkmarkedRow;
}

@end

@implementation SeleccionarPacienteTableViewController

@synthesize delegate = _delegate;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    UIBarButtonItem *hecho = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(hecho)];
    [[self navigationItem] setRightBarButtonItem:hecho];
    UIBarButtonItem *cancelar = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelar)];
    [[self navigationItem] setLeftBarButtonItem:cancelar];
    //Llamada asincrona, cargar las citas
    [self performSelectorInBackground:@selector(cargarDatos) withObject:nil];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return todosPacientes.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    NSDictionary *object;
    object = todosPacientes[indexPath.row];
    cell.textLabel.text = [object objectForKey:@"nombre"];
    if(checkmarkedRow == indexPath.row){
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Guardar nombre del paciente selccionado
    paciente = todosPacientes[indexPath.row];

    // In cellForRow... we check this variable to decide where we put the checkmark
    checkmarkedRow = indexPath.row;

    // We reload the table view and the selected row will be checkmarked
    [tableView reloadData];

    // We select the row without animation to simulate that nothing happened here :)
    [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

    // We deselect the row with animation
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (void) cargarDatos
{
    //Path donde se encuentra el plist con los datos
    NSString *path = [[NSBundle mainBundle]pathForResource:@"pacientes" ofType:@"plist"];

    //Guardamos las citas en un NSMutableArray
    todosPacientes = [[NSMutableArray alloc]initWithContentsOfFile:path];
}

- (void) hecho
{
    /*Is anyone listening
    if([delegate respondsToSelector:@selector(paciente:)])
    {
        //send the delegate function with the amount entered by the user
        [delegate paciente:paciente];
    }*/
    [self.delegate paciente:paciente];
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void) cancelar
{
    [self dismissViewControllerAnimated:YES completion:nil];
}


@end

解决方案: 我不确定它是如何工作的,即使这是真正的解决方案。我使用了Hani Ibrahim的anwer,但它没有用,但他说的是对的。然后我在[self.delegate paciente:paciente]的hecho方法中改变了[delegate paciente:paciente]并且它有效。 我希望这可以帮助别人。

2 个答案:

答案 0 :(得分:1)

问题是你的seque显示UINavigationController而不是SeleccionarPacienteTableViewController

更改此方法

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if( [segue.identifier isEqualToString:@"listaPacientes"] )
    {
        SeleccionarPacienteTableViewController *viewController = segue.destinationViewController;
        viewController.delegate = self;
    }
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if( [segue.identifier isEqualToString:@"listaPacientes"] )
    {
        UINavigationController *navController = segue.destinationViewController;
        SeleccionarPacienteTableViewController *viewController = [navController.viewControllers objectAtIndex:0];
        viewController.delegate = self;
    }
}

您还有其他问题

这样做

@property(nonatomic,assign)id<SeleccionarPacienteTableViewControllerDelegate> delegate;

和这个

@synthesize delegate = _delegate;

然后,您的属性将使用名为&#39; _delegate&#39;的实例变量。正如你所说@synthesize delegate = _delegate;

然而这段代码

@interface SeleccionarPacienteTableViewController : UITableViewController
{
    id delegate;
}

定义了一个名为delegate的新实例变量,它与您的属性

完全不同

因此,要访问您的媒体资源,您可以使用self.delegate_delegate NOT delegate,因为它是另一个实例变量!

答案 1 :(得分:0)

我认为问题出在prepareForSegue上。 destinationViewController是一个UINavigationController,而不是一个SeleccionarPacienteTableViewController。

您必须访问destinationViewController的第一个子节点才能获得SeleccionarPacienteTableViewController。

segue.destinationViewController替换[segue.destinationViewController topViewController]可能会解决您的问题。