Ios 自定义委托在调用方法时变为零
我想要的是,当我向数据库添加新数据时,我使用的表视图应该自动重新加载 我的表格视图位于MasterViewController中。UserDetailUI包含在数据库中存储数据的表单 这是我的密码: MasterViewController.hIos 自定义委托在调用方法时变为零,ios,objective-c,Ios,Objective C,我想要的是,当我向数据库添加新数据时,我使用的表视图应该自动重新加载 我的表格视图位于MasterViewController中。UserDetailUI包含在数据库中存储数据的表单 这是我的密码: MasterViewController.h #import <UIKit/UIKit.h> #import "DBManager.h" #import "UserDetailsUi.h" @interface MasterViewController : UITableViewCon
#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;
}
使用不为零的prepareforsgue()
方法
InstanceViewController WithiIdentifier()将创建视图控制器的新实例,您需要使用现有实例。。。因此,
prepareforsgue()
比委托更可取您需要在prepareforsgue而不是viewDidLoad中设置委托。您在viewDidLoad中创建的细节控制器实例与segue创建的实例不同,这就是您的委托为零的原因 在UserDetailsUi对象中,您在哪里设置_委托?我想它应该是MasterViewController的一个实例。是的,我设置了MasterViewController的实例。在MasterViewController.m文件中,我编写了userDetail.delegate=self;这句话让userDetail.delegate有一个masterviewcontroller的引用…我相信你是在做更多的事情。您应该交换[self.navigationController popViewControllerAnimated:YES]
和[\u委托重新加载TableData]代码>。我也试过了,但在[\u delegate reloadTableData]时,委托仍然为零;我从MasterViewController切换到UserDetailUI。所以我可以将数据从MasterViewController传输到UserDetailUI,但我希望当我按下UserDetailUI页面的add按钮时,MasterViewController的Tableview应该被刷新。。。因此,我认为我不能使用此方法,因为从UserDetailUi到MasterViewController之间没有分段。您正在创建一个新的userDetail(0xa4cf290),它不是由分段(0xb15cc30)创建的。
- (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];
}
#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
#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];
}