2014-03-12 1 views
0

나는 PeopleTableViewControllerConfirmedTableViewControlleriOS 7 앱의 objective-c에서 기본 위임 구현을위한 단계는 무엇입니까?

PeopleTableViewController 있습니다 목록을 엄격하게 볼 목적으로 사람을 확인에만 ConfirmedTableViewController : 동일 보류하거나

내 목표는 ConfirmedTableViewController에서 변경을하는 것입니다 삭제 위와 같지만, 능력으로 수 앱을 다시 시작할 필요없이 PeopleTableViewController에 반영되었습니다. 필자는 원래 parse.com [self loadObjects]을 사용하여이를 수정하여 객체에 대한 최신 변경 사항을 내 tableView에 사용되는 NSArray로 다시로드합니다.

이 방법을 viewWillAppear 메서드에 넣었습니다. PeopleTableViewController을 입력하고 PeopleTableController 탭을 클릭하면 다시 그 테이블을 가져 와서 새로 고칩니다.

이것은 내 앱의 다른 부분에서 문제를 일으켜 제거해야했습니다. 나는 다른 솔루션을 찾기 위해 NSNotificationCenter을 찾아왔다. 이것은 나를 위해 완벽하게 작동했지만 나중에 관측자를 제거해야한다는 생각을 좋아하지 않았습니다. 또한 ConfirmedTableViewController의 변경 사항에 대해 알아야 할 유일한 클래스는 PeopleTableViewController 이었기 때문에 위임을 사용하는 것이 좋습니다.

나는 단순히 내 데이터베이스가 성공적으로 업데이트 된 후 해고 블록이 추가

: PeopleTableViewController 내 viewWillAppear 방법에서 다음

[[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 

내 구현 :

내가 ConfirmedTableViewController의 행과 actionsheet 인스턴스 화재를 클릭 : 여기

// 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]; 
} 

이 일어나는 것이다. 해당 인스턴스의 버튼 중 하나는 "오프라인 상태가됩니다"이며 데이터베이스의 값이 0으로 설정되어 개체가 확인 된 목록에 더 이상 표시되지 않습니다.

저장 성공 나는 confirmOrDeletedPerson 메서드를 실행하여 다시 PeopleTableViewController의 tabBar에 연결된 탭을 클릭하여 반환하면 PeopleTableViewController에 반영된 변경 사항을 볼 수 있습니다. 그러나 아무 일도 일어나지 않고 있습니다. 내가 놓친 게 있니? stackoverflow 답변을 사용하여 구현하는 많은 다른 버전을 시도했지만 아무도 작동하지 않습니다.

업데이트 TableViewController 6 TableViewController 13 의 방법을 실행하는 데 필요

그래서 TableViewController 6 (맹목적 튜토리얼 다음) TableViewController 13

나는 새로운 인스턴스를 생성 한에 대한 참조를 필요로한다. 이것은 알림 센터를 사용하는 것보다 훨씬 더 복잡하며 그러한 단순한 작업을 위해 번거 로움을받을만한 가치가 있는지 궁금해합니다.

enter image description here

+0

왜 [[자체 위임] performSelector : @selector (verifiedOrDeletedPerson)]을 사용하고 있습니까? 단순히 [self.delegate confirmedOrDeletedPerson] 대신; ? 메소드가 존재하는지 여부를 컴파일 타임에 확신하지 못하더라도 performSelector를 사용하는 것이 현명하다. 그러나 그 메소드를 테스트하지는 않는다. – Moonwalkr

+0

@MariusFalkenbergWaldal이 튜토리얼은 [여기] (http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates)에서 사용했습니다. 내가 시도하고있는 것은 Confirmed에서 db 업데이트 후 People에서 Confirmed의 메소드를 트리거하는 것입니다. – 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 : 개체가 nil (key : classname)이 될 수 없습니다.' – LondonGuy

+0

MPConfirmedPeopleTableViewController의 인스턴스를 만드는 것만으로는 충분하지 않으며보기 컨트롤러를 표시해야합니다.MPConfirmedPeopleTableViewController가 이미 네비게이션 컨트롤러의 루트보기 컨트롤러 인 경우, MPConfirmedPeopleTableViewController에서 MPPeopleTableViewController의 인스턴스를 만들고 관리하고 거기에서 대리자를 설정해야합니다. – aniruddhc

+0

그러나 my [self loadObject] 메서드는 UITable의 모든 새로 고침을 처리합니다. 그 클래스에있는 모든 곳에서 호출 할 수 있으며 최신 데이터로 tableView를 새로 고칩니다. 내가 데이터베이스에서 업데이트 할 때 ConfirmedTableViewController에서 호출하고 싶습니다. – LondonGuy

0

그냥 같이 저장 블록에서 메소드를 호출하기에 충분해야합니다

[self.delegate confirmedOrDeletedPerson]; 

MPPeopleTableViewController의 속성으로 MPConfirmedPeopleTableViewController를 선언 할 필요는 없습니다. 이 패턴을 자주 사용하고 일반적으로 이와 같은 뷰 컨트롤러의 속성을 만들지 않습니다.

+0

이것은 작동하지 않습니다. 사용자가 오프라인 상태가되면 다른 컨트롤러의 메소드를 트리거하여 테이블을 다시로드하지 않습니다. 내가 그것에 중단 점을 넣고 메서드는 데이터베이스 업데이트 후 무시됩니다. – LondonGuy

+0

무시 되었습니까? 호출을 수행하는 메소드에 중단 점을 넣었습니까? 아니면 호출 된 메서드? – Moonwalkr

+0

둘 다, 나는 그것이 저의 저축을 참조하고있는 것이 아니라 새로운 인스턴스를 사용하고 있었기 때문에 그것이 작동하지 않는 이유가 있다고 생각합니다. 나는 NSNotificationCenter를 사용하는 것으로 돌아갈 생각을하고 있습니다. 많은 번거 로움처럼 보입니다. 지금. 또한 보류중인 사용자를 라이브로 만들 때 다른 컨트롤러로부터 알림을 수신하려면 관찰자가 필요합니다. – LondonGuy

관련 문제