2014-03-12 14 views
0

我有PeopleTableViewControllerConfirmedTableViewController針對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.

我創建一個新的實例(盲從的教程)。 這比使用通知中心複雜得多,我想知道它是否值得爲這樣一個簡單的任務帶來麻煩。

enter image description here

+0

你爲什麼使用[[self delegate] performSelector:@selector(confirmedOrDeletedPerson)];而不是簡單的[self.delegate confirmedOrDeletedPerson]; ?如果在編譯時不確定該方法是否存在,但是您沒有測試存在,那麼使用performSelector是有意義的。 – Moonwalkr

+0

@MariusFalkenbergWaldal我正在關注的教程[這裏](http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates)使用了它。我試圖只是觸發確認後,我的數據庫更新確認人確認後的方法。 – LondonGuy

+0

好的。如果不確定對象是否實現給定的方法,通常會使用performSelector。然後您將首先測試它(使用respondsToSelector),然後在if語句中使用performSelector。爲了您的使用,您可以直接調用它,就像我之前的評論一樣。你能否檢查一下是否有所作爲?如果你試圖用調試器進入它會發生什麼? – Moonwalkr

回答

0

MPPeopleTableViewControllerviewWillAppear方法是創建的MPConfirmedPeopleTableViewController實例,但不保留它。該實例將在viewWillAppear方法之後發佈。您需要定義一個屬性來容納MPConfirmedPeopleTableViewController實例對象。此外,沒有代碼可以顯示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]; 
} 
+0

我不明白[self presentViewController:self.ctvc animated:YES completion:nil]的必要性; tableView已經在那裏。它也給我一個錯誤:原因:'*** setObjectForKey:對象不能爲零(鍵:classname)' – LondonGuy

+0

創建MPConfirmedPeopleTableViewController的實例是不夠的,你需要顯示視圖控制器。如果已經顯示MPConfirmedPeopleTableViewController,通過作爲導航控制器的根視圖控制器,則必須在MPConfirmedPeopleTableViewController中創建和管理MPPeopleTableViewController的實例,並在其中設置委託。 – aniruddhc

+0

但是我的[self loadObject]方法處理所有UITable的刷新。我可以調用該類中的任何位置,並使用最新數據刷新tableView。當我更新數據庫時,我想要做的就是從ConfirmedTableViewController調用它。 – LondonGuy

0

它應該是不夠的,只是調用從保存塊的方法是這樣的:

[self.delegate confirmedOrDeletedPerson]; 

沒有必要申報MPConfirmedPeopleTableViewControllerMPPeopleTableViewController的屬性。我經常使用這種模式,通常不會像這樣爲視圖控制器創建屬性。

+0

這也行不通。當用戶脫機時,它不會觸發另一個控制器中的方法來重新加載表。我在它上面放置了一個斷點,數據庫更新之後該方法被忽略。 – LondonGuy

+0

忽略?你在調用的方法中放置了一個斷點嗎?還是被調用的方法? – Moonwalkr

+0

兩者,我認爲它不工作的原因是因爲我正在使用一個新的實例,而不是引用我正在保存的一個實例。我想回到使用NSNotificationCenter,它似乎很麻煩馬上。另外,我需要觀察者監聽來自另一個控制器的通知,以便讓待定用戶處於活動狀態。 – LondonGuy

相關問題