我有PeopleTableViewController
和ConfirmedTableViewController
針對iOS 7應用程序的objective-c中的基本委託實現步驟是什麼?
PeopleTableViewController
:列出證實人們對於嚴格觀看僅供參考 ConfirmedTableViewController
:同上,但有能力做出未決或刪除
我的目標是在ConfirmedTableViewController
所做的更改是反映在PeopleTableViewController
而無需重新啓動應用程序。我最初通過使用parse.com [self loadObjects]
解決了這個問題,它將最新的對對象進行的最新更改重新加載到我的tableView中使用的NSArray中。
我PeopleTableViewController
放在此方法在我viewWillAppear
方法,然後點擊PeopleTableController
選項卡時要帶我回它的tableView它會被刷新。
這是我的應用程序的另一部分導致問題,所以不得不刪除它。然後我尋找一些其他的解決方案,並遇到了NSNotificationCenter
。這對我來說非常合適,但我不喜歡之後需要移除觀察者的想法。此外,使用授權也很有意義,因爲PeopleTableViewController
是唯一需要了解ConfirmedTableViewController
中所做更改的類。
我只是將此添加到被解僱後,我的數據庫已成功更新塊:
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshTable" object:nil];
然後在PeopleTableViewController我viewWillAppear中的方法,我把:
[[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實例火災。該實例中的一個按鈕是「脫機」,它將數據庫中的值設置爲0,這意味着該對象不會再顯示在已確認的列表中。
那麼,如果保存成功我想confirmedOrDeletedPerson法進行燒結,這樣,如果我通過點擊的TabBar我看到PeopleTableViewController
變化反映其關聯的標籤返回到PeopleTableViewController
。然而沒有發生。我錯過了什麼嗎?我已經嘗試了很多不同版本的實現這個使用stackoverflow的答案,但沒有工作。
更新
TableViewController 6需要TableViewController 13. 觸發方法因此TableViewController 6需要引用TableViewController 13.
我創建一個新的實例(盲從的教程)。 這比使用通知中心複雜得多,我想知道它是否值得爲這樣一個簡單的任務帶來麻煩。
你爲什麼使用[[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];而不是簡單的[self.delegate confirmedOrDeletedPerson]; ?如果在編譯時不確定該方法是否存在,但是您沒有測試存在,那麼使用performSelector是有意義的。 – Moonwalkr
@MariusFalkenbergWaldal我正在關注的教程[這裏](http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates)使用了它。我試圖只是觸發確認後,我的數據庫更新確認人確認後的方法。 – LondonGuy
好的。如果不確定對象是否實現給定的方法,通常會使用performSelector。然後您將首先測試它(使用respondsToSelector),然後在if語句中使用performSelector。爲了您的使用,您可以直接調用它,就像我之前的評論一樣。你能否檢查一下是否有所作爲?如果你試圖用調試器進入它會發生什麼? – Moonwalkr