Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义委托在调用方法时变为零_Ios_Objective C - Fatal编程技术网

Ios 自定义委托在调用方法时变为零

Ios 自定义委托在调用方法时变为零,ios,objective-c,Ios,Objective C,我想要的是,当我向数据库添加新数据时,我使用的表视图应该自动重新加载 我的表格视图位于MasterViewController中。UserDetailUI包含在数据库中存储数据的表单 这是我的密码: MasterViewController.h #import <UIKit/UIKit.h> #import "DBManager.h" #import "UserDetailsUi.h" @interface MasterViewController : UITableViewCon

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

我的表格视图位于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;
}
使用不为零的
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];
}