自定义代表在调用方法时变为零

时间:2014-07-08 04:19:21

标签: ios objective-c

我想要的是,当我向数据库添加新数据时,应该自动重新加载我使用的表视图。

我的表视图在MasterViewController中。 UserDetailUI包含用于在数据库中存储数据的表单。

这是我的代码::

MasterViewController.h

#import <UIKit/UIKit.h>
#import "DBManager.h"
#import "UserDetailsUi.h"

@interface MasterViewController : UITableViewController<UITableViewDataSource,UITableViewDelegate,ReloadDataDelegate>
{
    UserDetailsUi *userDetail;
    DBManager *db;
    NSMutableArray *firstName;
    NSMutableArray *lastName;
    NSMutableArray *profileData;
    NSMutableArray *rowId;
}

MasterViewController.m

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.tableView.delegate=self;
self.tableView.dataSource=self;

// Conferming Delegate
userDetail = [self.storyboard instantiateViewControllerWithIdentifier:@"UserDetails"];
// here i got the reference of UserDetailUI
userDetail.delegate=self;
// here i got the reference of masterviewController in delegate property.


    db = [DBManager getSharedDatabase];
NSString *createTableQuery = @"create table if not exists USER_MASTER (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, FirstName TEXT, LastName TEXT, ProfilePic TEXT)";
    [db createTable:createTableQuery];

    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
    self.navigationItem.rightBarButtonItem = addButton;


    [self downloadDataFromDatabase];
    [self.tableView reloadData];
}

-(void)downloadDataFromDatabase{
    NSString *selectQuery = @"select * from USER_MASTER";
    NSDictionary *data = [db retriveAllData:selectQuery];
    int numberOfRows = data.count;
    NSArray *keys = [[NSArray alloc]initWithArray:[data allKeys]];

    firstName = [[NSMutableArray alloc]init];
    lastName = [[NSMutableArray alloc]init];
    profileData = [[NSMutableArray alloc]init];
    rowId = [[NSMutableArray alloc]init];

    for (int counter; counter<numberOfRows; counter++) {
        NSDictionary *currentRow = [[NSDictionary alloc]initWithDictionary:[data objectForKey:[keys objectAtIndex:counter]]];
        [firstName addObject:[currentRow objectForKey:@"firstname"]];
        [lastName addObject:[currentRow objectForKey:@"lastname"]];
        [profileData addObject:[currentRow objectForKey:@"ProfilePicture"]];
        [rowId addObject:[currentRow objectForKey:@"RowId"]];
    }
}
- (void)insertNewObject:(id)sender {
    [self performSegueWithIdentifier:@"AddDetails" sender:nil];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDate *object = self.objects[indexPath.row];
        [[segue destinationViewController] setDetailItem:object];
    }
}
-(void)reloadTableData{
    // This is my delegate method
    [self.tableView reloadData];
}

UserDetailsUi.h

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

@protocol ReloadDataDelegate <NSObject>

@required
-(void)reloadTableData;
@end
@interface UserDetailsUi :   UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>{
    UIImagePickerController *imageChooser;
    __weak IBOutlet UIImageView *Profile_Pic;
    __weak IBOutlet UITextField *lnameTf;
    __weak IBOutlet UITextField *firstNameTf;
}
- (IBAction)addDetailsClicked:(id)sender;
@property (nonatomic,weak) id<ReloadDataDelegate> delegate;
@end

UserDetailsUi.m

#import "UserDetailsUi.h"

@implementation UserDetailsUi
    - (IBAction)addDetailsClicked:(id)sender {

    DBManager *db = [DBManager getSharedDatabase];
    NSString *profileEncoded = [self encodeToBase64String:Profile_Pic.image];
    NSString *query = [NSString stringWithFormat:@"INSERT INTO USER_MASTER (FirstName,LastName,ProfilePic) values ('%@','%@','%@');",firstNameTf.text,lnameTf.text,profileEncoded];
    [db insert:query];

    // delegate method call to reload table view

    [self.navigationController popViewControllerAnimated:YES];

    // at the time of execution this delegate object remains nil 
    [_delegate reloadTableData];
}

2 个答案:

答案 0 :(得分:2)

您需要在prepareForSegue而不是viewDidLoad中设置委托。您在viewDidLoad中创建的详细控制器的实例与segue创建的实例不同,这就是您的委托为零的原因。

答案 1 :(得分:0)

使用prepareForSegue()方法,该方法不是nil

instantiateViewControllerWithIdentifier()将创建新的视图控制器实例,您需要使用现有的...因此prepareForSegue()优于委派