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,例如作为导航控制器的根视图控制器,则必须创建和