iOS 7应用程序在objective-c中实现基本委派的步骤是什么?

iOS 7应用程序在objective-c中实现基本委派的步骤是什么?,ios,objective-c,cocoa-touch,uitableview,delegates,Ios,Objective C,Cocoa Touch,Uitableview,Delegates,我有PeopleTableViewController和confirfiedTableViewController PeopleTableViewController:列出已确认的人员,仅供严格查看 ConfirmedTableViewController:与上述相同,但具有挂起或删除的功能 我的目标是将在confirfiedTableViewController中所做的更改反映在PeopleTableViewController中,而无需重新启动应用程序。我最初通过使用parse.com[se

我有
PeopleTableViewController
confirfiedTableViewController

PeopleTableViewController
:列出已确认的人员,仅供严格查看
ConfirmedTableViewController
:与上述相同,但具有挂起或删除的功能

我的目标是将在
confirfiedTableViewController
中所做的更改反映在
PeopleTableViewController
中,而无需重新启动应用程序。我最初通过使用parse.com
[self-loadObjects]
解决了这个问题,它将对对象所做的最新更改重新加载到我的tableView中使用的NSArray中

我将此方法放置在我的
视图中,将在
PeopleTableViewController
中显示
方法,当单击
PeopleTableController
选项卡将我带回其表视图时,它将被刷新

这导致我的应用程序的另一部分出现问题,因此必须将其删除。然后我寻找了一些其他的解决方案,发现了
NSNotificationCenter
。这对我来说非常有效,但我不喜欢事后需要移除观察者的想法。另外,使用委派也是有意义的,因为
PeopleTableViewController
是唯一需要知道在
ConfirmedTableViewController
中所做更改的类

我只是将其添加到数据库成功更新后触发的块中:

[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTable) name:@"refreshTable" object:nil];
//MPConfirmedTableViewController.h

    #import <UIKit/UIKit.h>
    #import "Person.h"
    #import <Parse/Parse.h>

    @class MPConfirmedPeopleTableViewDelegate;

    @protocol MPConfirmedPeopleTableViewDelegate <NSObject>

    - (void)confirmedOrDeletedPerson;

    @end

    @interface MPConfirmedPeopleTableViewController : PFQueryTableViewController

    @property (nonatomic,weak) id <MPConfirmedPeopleTableViewDelegate> delegate;

    @end
// MPConfirmedTableViewController.m
    if (buttonIndex == 1) {
        [self showProgressHud];
        PFQuery *query = [PFQuery queryWithClassName:@"People"];
        // Retrieve the object by id
        [query getObjectInBackgroundWithId:[[self selectedPerson] objectId] block:^(PFObject *person, NSError *error) {

            if (!error) {
                // will get sent to the cloud.
                person[@"active"] = @0;
                [[self searchDisplayController] setActive:NO];
                [person saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                    if (!error) {
                        [self loadObjects];
                        [[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];
                     //   [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
                    } else {
                        [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                        [MBProgressHUD hideHUDForView:[self view] animated:YES];
                        [errorPopup show];

                    }
                }];

            } else {
                [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                [MBProgressHUD hideHUDForView:[self view] animated:YES];
                [errorPopup show];
            }
        }];

    }
}
//MPPeopleTableViewController.h
#import <UIKit/UIKit.h>
#import "Person.h"
#import "MPDisplayViewController.h"
#import <Parse/Parse.h>


@interface MPPeopleTableViewController : PFQueryTableViewController 
@end
// MPPeopleTableViewController

#import "MPPeopleTableViewController.h"
#import "MPContactFormViewController.h"
#import "MBProgressHUD.h"
#import "MPConfirmedPeopleTableViewController.h"

@interface MPPeopleTableViewController () <UISearchDisplayDelegate, UINavigationBarDelegate, UITabBarControllerDelegate, MPConfirmedPeopleTableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MPPeopleTableViewController

- (void)viewWillAppear:(BOOL)animated {
    MPConfirmedPeopleTableViewController *ctvc = [[MPConfirmedPeopleTableViewController alloc] init];
    [ctvc setDelegate: self];

}

- (void)confirmedOrDeletedPerson {
    NSLog(@"confirmed or deleted person");
    [self loadObjects];
}
然后,在我的视图中,我将在PeopleTableViewController中显示方法:

[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTable) name:@"refreshTable" object:nil];
//MPConfirmedTableViewController.h

    #import <UIKit/UIKit.h>
    #import "Person.h"
    #import <Parse/Parse.h>

    @class MPConfirmedPeopleTableViewDelegate;

    @protocol MPConfirmedPeopleTableViewDelegate <NSObject>

    - (void)confirmedOrDeletedPerson;

    @end

    @interface MPConfirmedPeopleTableViewController : PFQueryTableViewController

    @property (nonatomic,weak) id <MPConfirmedPeopleTableViewDelegate> delegate;

    @end
// MPConfirmedTableViewController.m
    if (buttonIndex == 1) {
        [self showProgressHud];
        PFQuery *query = [PFQuery queryWithClassName:@"People"];
        // Retrieve the object by id
        [query getObjectInBackgroundWithId:[[self selectedPerson] objectId] block:^(PFObject *person, NSError *error) {

            if (!error) {
                // will get sent to the cloud.
                person[@"active"] = @0;
                [[self searchDisplayController] setActive:NO];
                [person saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                    if (!error) {
                        [self loadObjects];
                        [[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];
                     //   [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
                    } else {
                        [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                        [MBProgressHUD hideHUDForView:[self view] animated:YES];
                        [errorPopup show];

                    }
                }];

            } else {
                [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                [MBProgressHUD hideHUDForView:[self view] animated:YES];
                [errorPopup show];
            }
        }];

    }
}
//MPPeopleTableViewController.h
#import <UIKit/UIKit.h>
#import "Person.h"
#import "MPDisplayViewController.h"
#import <Parse/Parse.h>


@interface MPPeopleTableViewController : PFQueryTableViewController 
@end
// MPPeopleTableViewController

#import "MPPeopleTableViewController.h"
#import "MPContactFormViewController.h"
#import "MBProgressHUD.h"
#import "MPConfirmedPeopleTableViewController.h"

@interface MPPeopleTableViewController () <UISearchDisplayDelegate, UINavigationBarDelegate, UITabBarControllerDelegate, MPConfirmedPeopleTableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MPPeopleTableViewController

- (void)viewWillAppear:(BOOL)animated {
    MPConfirmedPeopleTableViewController *ctvc = [[MPConfirmedPeopleTableViewController alloc] init];
    [ctvc setDelegate: self];

}

- (void)confirmedOrDeletedPerson {
    NSLog(@"confirmed or deleted person");
    [self loadObjects];
}
上面的工作很好,但我想使用授权

以下是我的委派实施不起作用:

[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTable) name:@"refreshTable" object:nil];
//MPConfirmedTableViewController.h

    #import <UIKit/UIKit.h>
    #import "Person.h"
    #import <Parse/Parse.h>

    @class MPConfirmedPeopleTableViewDelegate;

    @protocol MPConfirmedPeopleTableViewDelegate <NSObject>

    - (void)confirmedOrDeletedPerson;

    @end

    @interface MPConfirmedPeopleTableViewController : PFQueryTableViewController

    @property (nonatomic,weak) id <MPConfirmedPeopleTableViewDelegate> delegate;

    @end
// MPConfirmedTableViewController.m
    if (buttonIndex == 1) {
        [self showProgressHud];
        PFQuery *query = [PFQuery queryWithClassName:@"People"];
        // Retrieve the object by id
        [query getObjectInBackgroundWithId:[[self selectedPerson] objectId] block:^(PFObject *person, NSError *error) {

            if (!error) {
                // will get sent to the cloud.
                person[@"active"] = @0;
                [[self searchDisplayController] setActive:NO];
                [person saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                    if (!error) {
                        [self loadObjects];
                        [[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];
                     //   [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
                    } else {
                        [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                        [MBProgressHUD hideHUDForView:[self view] animated:YES];
                        [errorPopup show];

                    }
                }];

            } else {
                [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                [MBProgressHUD hideHUDForView:[self view] animated:YES];
                [errorPopup show];
            }
        }];

    }
}
//MPPeopleTableViewController.h
#import <UIKit/UIKit.h>
#import "Person.h"
#import "MPDisplayViewController.h"
#import <Parse/Parse.h>


@interface MPPeopleTableViewController : PFQueryTableViewController 
@end
// MPPeopleTableViewController

#import "MPPeopleTableViewController.h"
#import "MPContactFormViewController.h"
#import "MBProgressHUD.h"
#import "MPConfirmedPeopleTableViewController.h"

@interface MPPeopleTableViewController () <UISearchDisplayDelegate, UINavigationBarDelegate, UITabBarControllerDelegate, MPConfirmedPeopleTableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MPPeopleTableViewController

- (void)viewWillAppear:(BOOL)animated {
    MPConfirmedPeopleTableViewController *ctvc = [[MPConfirmedPeopleTableViewController alloc] init];
    [ctvc setDelegate: self];

}

- (void)confirmedOrDeletedPerson {
    NSLog(@"confirmed or deleted person");
    [self loadObjects];
}
保存要触发的方法的另一个控制器:

[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTable) name:@"refreshTable" object:nil];
//MPConfirmedTableViewController.h

    #import <UIKit/UIKit.h>
    #import "Person.h"
    #import <Parse/Parse.h>

    @class MPConfirmedPeopleTableViewDelegate;

    @protocol MPConfirmedPeopleTableViewDelegate <NSObject>

    - (void)confirmedOrDeletedPerson;

    @end

    @interface MPConfirmedPeopleTableViewController : PFQueryTableViewController

    @property (nonatomic,weak) id <MPConfirmedPeopleTableViewDelegate> delegate;

    @end
// MPConfirmedTableViewController.m
    if (buttonIndex == 1) {
        [self showProgressHud];
        PFQuery *query = [PFQuery queryWithClassName:@"People"];
        // Retrieve the object by id
        [query getObjectInBackgroundWithId:[[self selectedPerson] objectId] block:^(PFObject *person, NSError *error) {

            if (!error) {
                // will get sent to the cloud.
                person[@"active"] = @0;
                [[self searchDisplayController] setActive:NO];
                [person saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                    if (!error) {
                        [self loadObjects];
                        [[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];
                     //   [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
                    } else {
                        [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                        [MBProgressHUD hideHUDForView:[self view] animated:YES];
                        [errorPopup show];

                    }
                }];

            } else {
                [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                [MBProgressHUD hideHUDForView:[self view] animated:YES];
                [errorPopup show];
            }
        }];

    }
}
//MPPeopleTableViewController.h
#import <UIKit/UIKit.h>
#import "Person.h"
#import "MPDisplayViewController.h"
#import <Parse/Parse.h>


@interface MPPeopleTableViewController : PFQueryTableViewController 
@end
// MPPeopleTableViewController

#import "MPPeopleTableViewController.h"
#import "MPContactFormViewController.h"
#import "MBProgressHUD.h"
#import "MPConfirmedPeopleTableViewController.h"

@interface MPPeopleTableViewController () <UISearchDisplayDelegate, UINavigationBarDelegate, UITabBarControllerDelegate, MPConfirmedPeopleTableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MPPeopleTableViewController

- (void)viewWillAppear:(BOOL)animated {
    MPConfirmedPeopleTableViewController *ctvc = [[MPConfirmedPeopleTableViewController alloc] init];
    [ctvc setDelegate: self];

}

- (void)confirmedOrDeletedPerson {
    NSLog(@"confirmed or deleted person");
    [self loadObjects];
}
//MPPeopleTableViewController.h
#进口
#输入“Person.h”
#导入“MPDisplayViewController.h”
#进口
@接口MPPeopleTableViewController:PFQueryTableViewController
@结束
我的实现:

[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTable) name:@"refreshTable" object:nil];
//MPConfirmedTableViewController.h

    #import <UIKit/UIKit.h>
    #import "Person.h"
    #import <Parse/Parse.h>

    @class MPConfirmedPeopleTableViewDelegate;

    @protocol MPConfirmedPeopleTableViewDelegate <NSObject>

    - (void)confirmedOrDeletedPerson;

    @end

    @interface MPConfirmedPeopleTableViewController : PFQueryTableViewController

    @property (nonatomic,weak) id <MPConfirmedPeopleTableViewDelegate> delegate;

    @end
// MPConfirmedTableViewController.m
    if (buttonIndex == 1) {
        [self showProgressHud];
        PFQuery *query = [PFQuery queryWithClassName:@"People"];
        // Retrieve the object by id
        [query getObjectInBackgroundWithId:[[self selectedPerson] objectId] block:^(PFObject *person, NSError *error) {

            if (!error) {
                // will get sent to the cloud.
                person[@"active"] = @0;
                [[self searchDisplayController] setActive:NO];
                [person saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                    if (!error) {
                        [self loadObjects];
                        [[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];
                     //   [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
                    } else {
                        [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                        [MBProgressHUD hideHUDForView:[self view] animated:YES];
                        [errorPopup show];

                    }
                }];

            } else {
                [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                [MBProgressHUD hideHUDForView:[self view] animated:YES];
                [errorPopup show];
            }
        }];

    }
}
//MPPeopleTableViewController.h
#import <UIKit/UIKit.h>
#import "Person.h"
#import "MPDisplayViewController.h"
#import <Parse/Parse.h>


@interface MPPeopleTableViewController : PFQueryTableViewController 
@end
// MPPeopleTableViewController

#import "MPPeopleTableViewController.h"
#import "MPContactFormViewController.h"
#import "MBProgressHUD.h"
#import "MPConfirmedPeopleTableViewController.h"

@interface MPPeopleTableViewController () <UISearchDisplayDelegate, UINavigationBarDelegate, UITabBarControllerDelegate, MPConfirmedPeopleTableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MPPeopleTableViewController

- (void)viewWillAppear:(BOOL)animated {
    MPConfirmedPeopleTableViewController *ctvc = [[MPConfirmedPeopleTableViewController alloc] init];
    [ctvc setDelegate: self];

}

- (void)confirmedOrDeletedPerson {
    NSLog(@"confirmed or deleted person");
    [self loadObjects];
}
//MPPeopleTableViewController
#导入“MPPeopleTableViewController.h”
#导入“MPContactFormViewController.h”
#导入“MBProgressHUD.h”
#导入“MPConfirmedPeopleTableViewController.h”
@接口MPPeopleTableViewController()
@属性(强,非原子)IBUITableView*tableView;
@结束
@MPPeopleTableViewController的实现
-(无效)视图将显示:(BOOL)动画{
MPConfirmedPeopleTableViewController*ctvc=[[MPConfirmedPeopleTableViewController alloc]init];
[ctvc setDelegate:self];
}
-(无效)确认人删除人{
NSLog(“确认或删除人”);
[自动加载对象];
}
发生的情况如下:

[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTable) name:@"refreshTable" object:nil];
//MPConfirmedTableViewController.h

    #import <UIKit/UIKit.h>
    #import "Person.h"
    #import <Parse/Parse.h>

    @class MPConfirmedPeopleTableViewDelegate;

    @protocol MPConfirmedPeopleTableViewDelegate <NSObject>

    - (void)confirmedOrDeletedPerson;

    @end

    @interface MPConfirmedPeopleTableViewController : PFQueryTableViewController

    @property (nonatomic,weak) id <MPConfirmedPeopleTableViewDelegate> delegate;

    @end
// MPConfirmedTableViewController.m
    if (buttonIndex == 1) {
        [self showProgressHud];
        PFQuery *query = [PFQuery queryWithClassName:@"People"];
        // Retrieve the object by id
        [query getObjectInBackgroundWithId:[[self selectedPerson] objectId] block:^(PFObject *person, NSError *error) {

            if (!error) {
                // will get sent to the cloud.
                person[@"active"] = @0;
                [[self searchDisplayController] setActive:NO];
                [person saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                    if (!error) {
                        [self loadObjects];
                        [[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];
                     //   [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
                    } else {
                        [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                        [MBProgressHUD hideHUDForView:[self view] animated:YES];
                        [errorPopup show];

                    }
                }];

            } else {
                [[self tableView] setSeparatorStyle: UITableViewCellSeparatorStyleSingleLine];
                [MBProgressHUD hideHUDForView:[self view] animated:YES];
                [errorPopup show];
            }
        }];

    }
}
//MPPeopleTableViewController.h
#import <UIKit/UIKit.h>
#import "Person.h"
#import "MPDisplayViewController.h"
#import <Parse/Parse.h>


@interface MPPeopleTableViewController : PFQueryTableViewController 
@end
// MPPeopleTableViewController

#import "MPPeopleTableViewController.h"
#import "MPContactFormViewController.h"
#import "MBProgressHUD.h"
#import "MPConfirmedPeopleTableViewController.h"

@interface MPPeopleTableViewController () <UISearchDisplayDelegate, UINavigationBarDelegate, UITabBarControllerDelegate, MPConfirmedPeopleTableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation MPPeopleTableViewController

- (void)viewWillAppear:(BOOL)animated {
    MPConfirmedPeopleTableViewController *ctvc = [[MPConfirmedPeopleTableViewController alloc] init];
    [ctvc setDelegate: self];

}

- (void)confirmedOrDeletedPerson {
    NSLog(@"confirmed or deleted person");
    [self loadObjects];
}
我单击
ConfirmedTableViewController
中的一行,就会触发一个actionsheet实例。该实例上的一个按钮是“takeoffline”,它将数据库中的一个值设置为0,这意味着该对象将不再显示在确认列表中

如果保存成功,我希望激活confirmedDeletedPerson方法,这样,如果我通过单击选项卡栏上与其关联的选项卡返回到
PeopleTableViewController
,我会看到
PeopleTableViewController
中反映的更改。然而,一切都没有发生。我错过什么了吗?我尝试过使用stackoverflow answers实现此功能的许多不同版本,但都没有成功

更新

TableViewController 6需要触发TableViewController 13中的方法。 因此TableViewController 6需要对TableViewController 13的引用

我正在创建一个新实例(盲目地遵循教程)。 这比使用通知中心要复杂得多,我想知道这样一个简单的任务是否值得这么麻烦


MPPeopleTableViewController
中,
视图将出现
方法正在创建
MPConfirmedPeopleTableViewController
的实例,但不保留它。实例将在
视图出现后释放。您需要定义一个属性来保存
mpconfirmedPeopleViewController
实例对象。此外,没有代码显示
MPConfirmedPeopleTableViewController
控制器

下面是一个应该可以工作的更新的实现

// MPPeopleTableViewController

#import "MPPeopleTableViewController.h"
#import "MPContactFormViewController.h"
#import "MBProgressHUD.h"

@interface MPPeopleTableViewController () <UISearchDisplayDelegate, UINavigationBarDelegate, UITabBarControllerDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) MPConfirmedPeopleTableViewController *ctvc;
@end

@implementation MPPeopleTableViewController

- (void) viewDidLoad
{
    self.ctvc = [[MPConfirmedPeopleTableViewController alloc] init];
    [self.ctvc setDelegate: self];
}

- (void)viewWillAppear:(BOOL)animated {
    [self presentViewController:self.ctvc animated:YES completion:nil];
}

- (void)confirmedOrDeletedPerson {
    NSLog(@"confirmed or deleted person");
    [self loadObjects];
}
//MPPeopleTableViewController
#导入“MPPeopleTableViewController.h”
#导入“MPContactFormViewController.h”
#导入“MBProgressHUD.h”
@接口MPPeopleTableViewController()
@属性(强,非原子)IBUITableView*tableView;
@属性(强,非原子)MPConfirmedPeopleTableViewController*ctvc;
@结束
@MPPeopleTableViewController的实现
-(无效)viewDidLoad
{
self.ctvc=[[MPConfirmedPeopleTableViewController alloc]init];
[self.ctvc setDelegate:self];
}
-(无效)视图将显示:(BOOL)动画{
[自我呈现视图控制器:self.ctvc动画:是完成:无];
}
-(无效)确认人删除人{
NSLog(“确认或删除人”);
[自动加载对象];
}

只要像这样从save块调用该方法就足够了:

[self.delegate confirmedOrDeletedPerson];

无需将
MPConfirmedPeopleTableViewController
声明为
MPPeopleTableViewController
中的属性。我经常使用这种模式,通常不会像这样为视图控制器创建属性

我不理解需要[self-presentViewController:self.ctvc动画:是完成:无];tableView已经在那里了。这也给了我一个错误:原因:“***setObjectForKey:object不能为nil(键:classname)”创建MPConfirmedPeopleTableViewController的实例是不够的,您需要显示视图控制器。如果已经显示MPConfirmedPeopleTableViewController,例如作为导航控制器的根视图控制器,则必须创建和