나는 PeopleTableViewController
및 ConfirmedTableViewController
iOS 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
나는 새로운 인스턴스를 생성 한에 대한 참조를 필요로한다. 이것은 알림 센터를 사용하는 것보다 훨씬 더 복잡하며 그러한 단순한 작업을 위해 번거 로움을받을만한 가치가 있는지 궁금해합니다.
왜 [[자체 위임] performSelector : @selector (verifiedOrDeletedPerson)]을 사용하고 있습니까? 단순히 [self.delegate confirmedOrDeletedPerson] 대신; ? 메소드가 존재하는지 여부를 컴파일 타임에 확신하지 못하더라도 performSelector를 사용하는 것이 현명하다. 그러나 그 메소드를 테스트하지는 않는다. – Moonwalkr
@MariusFalkenbergWaldal이 튜토리얼은 [여기] (http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates)에서 사용했습니다. 내가 시도하고있는 것은 Confirmed에서 db 업데이트 후 People에서 Confirmed의 메소드를 트리거하는 것입니다. – LondonGuy
확인. 객체가 지정된 메서드를 구현하는지 확실하지 않은 경우 일반적으로 performSelector를 사용합니다. 그런 다음 먼저 respondsToSelector를 사용하여 테스트 한 다음 if 문 내에서 performSelector를 사용합니다. 당신의 사용을 위해, 당신은 단지 이전 직설 에서처럼 그것을 직접 호출 할 수 있습니다. 그 점이 다른 점이 있는지 확인할 수 있습니까? 디버거를 사용하여 작업을 시작하면 어떻게됩니까? – Moonwalkr