0

2 개의 탭이있는 탭바 컨트롤러가 있습니다. 탭 A는 일반 UIViewController이고 탭 B는 TableViewController입니다. 내 탭에서TableViewController에 대한 NSNotification이 작동하지 않습니다.

//"itemAddedToCartDictionary" is the object that I am sending with notification 

[[NSNotificationCenter defaultCenter] postNotificationName:@"ItemAddedToCart" object:nil userInfo:itemAddedToCartDictionary]; 

: 나는 탭 a에서 NSNotification을 게시하고 같은를 받고

내가 아래 탭 A로부터 통지를 게시 탭 B. 테이블에서 데이터를 표시하는 것을 시도하고있다 B (TableViewController), NSMutableArray 속성 업데이트 위의 알림을 받으려고합니다. 속성은 다음과 같이 선언한다 :

탭 B - .H 파일 :

@property (nonatomic,strong) NSMutableArray *cart; 

탭 B -하는 .m 파일 : 이제

//providing manual setter method for 'items' hence not using @synthesize 
- (void)setCart:(NSMutableArray *)cart{ 
    _cart = cart; 
    [self.tableView reloadData]; 
} 

, 나는 통지를 수신하기위한 코드를 배치했다 로 awakeFromNib에서 (탭 B)에서 다음과 같이 :

- (void)awakeFromNib{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addCurrentItemToCartFromNotification:) name:@"ItemAddedToCart" object:nil]; 
} 

코드 "addCurrentItemToCartFromNotification"시 메소드를 호출 통지를받은 어떤 업데이트 내 재산 :

- (void)addCurrentItemToCartFromNotification:(NSNotification *)notification{ 

NSDictionary *currentItem = [notification.userInfo objectForKey:@"CART_ITEM_INFORMATION"]; 

if (!self.cart){ 
    NSLog(@"self.cart == nil"); 
    self.cart = [[NSMutableArray alloc] init]; 
}else{ 
    NSLog(@"self.cart != nil"); 
} 

[self.cart addObject:currentItem]; 


} 

지금이 내가 직면하고있는 문제이다 : 나는 탭 A의 알림을 게시 한 후

을 탭 B (TableViewController)는 모든 데이터를 표시하지 않습니다 위의 메소드에서 등록 정보를 업데이트해도 수신 된 알림이 생성됩니다. 내있는 TableView 데이터 소스 방법은 다음과 같습니다 :

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.cart count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"itemInCart"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

NSDictionary *cartItem = [self.cart objectAtIndex:indexPath.row]; 
cell.textLabel.text = [cartItem objectForKey:@"ITEM_NAME"]; 

return cell; 
} 

그래서 기본적으로, 나는 (I 수신 및 알림에서 업데이트 오전) 데이터 소스 방법에서하고 데이터를 반환하지 않습니다 내 TableViewController의 속성에 액세스하고

.

여기에서 내가 어디에서 무엇을 놓쳤는 지 알려주십시오.

덕분에, 마이크

편집 : @Joel, @martin에서 응답 다음은 도움 (방법은 통지를 수신 할 때 호출되는)

내 "addCurrentItemToCartFromNotification"을 다시로드 데이터를 추가 @mkirci. 이제는 Tab B (TableViewController)에서 알림을 수신 한 항목을 볼 수 있습니다.

지금 여기서 무슨 일이 일어나고 있는지의 : 알림이 수신 될 때마다

에서, NSMutableArray의 속성이 전무로 반환되고있다. 따라서 알림이 수신 될 때마다 alloc 초기화는 NSMutableArray 속성 (addCurrentItemToCartFromNotification에 있음)에 대해 발생합니다. - 단지 처음이 아닌). 따라서 알림에서받은 객체로 배열을 증가시키는 대신 배열은 매번 생성되고 현재 알림이 추가되는 객체 양식 만 만들어집니다.

제발이 상황에 대해 좀 알려주세요. 모든 응답을 감사하십시오.

감사합니다, 마이크

EDIT2

업데이트 된 코드는 항목을 추가 한 후 @Joel

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ 
if (!self.cart){ 
    NSLog(@"self.cart == nil"); 
    self.cart = [[NSMutableArray alloc] init]; 
}else{ 
    NSLog(@"self.cart != nil"); 
} 
return self; 
} 

답변

1

당신은 테이블을 다시로드되지에서 제안에 대한 initwithnibname에 대한 냈다.

배열을 만들고 설정 한 후에 테이블을 다시로드하는 중이며 항목을 추가 할 때도 업데이트해야합니다.

+0

... 또는 더 멋진 애니메이션을 제공하는'insertRowsAtIndexPaths'를 사용하십시오. –

+0

@mkirci - 내 제안으로 내 문제가 해결되었습니다. 그러나, 나는 편집 문제로 제기 된 다른 문제에 직면하고있다. 당신이 그것을보고 당신의 의견을 공유 할 수 있다면 고맙겠습니다. 감사! –

+0

@MikeG 게시 한 코드가 작동해야합니다. 실행되지 않을 것으로 예상되는 다른 값을 지정하지 않았습니까? – mkirci

1

몇 가지 문제가 있습니다. 우선, 데이터 배열에 객체를 추가 할 때 사용자 정의 setter가 호출되지 않습니다. 배열에 항목을 추가하거나 제거하지 않고 NSArray 자체를 만들 때만 호출됩니다. 따라서 사용자 정의 setter를 폐기하고 addCurrentItemToCartFromNotification 알림에서 reloadData를 호출해야합니다.

또한 observor를 viewDidLoad에 추가하고 awakeFromNib (특정 상황에서 호출되지 않음)이 아닌 viewDidUnload에서 제거해야합니다.

+0

세터 방법에 좋은 캐치! - 그러나 'viewDidUnload'는 관찰자를 등록 해제하기에 좋은 장소가 아닙니다. 왜냐하면 그 방법은 iOS 6에서는 더 이상 호출되지 않기 때문입니다. –

+0

흥미 롭습니다. 아직 iOS 6 프로젝트를 완료하지는 않았지만 그 소식은 저에게 있습니다. 좋은 지적. 이제 dealloc에서 처리됩니까? – Joel

+0

@ 조엘 - 나는 당신의 제안을 시도했다 : a) "addCurrentItemToCartFromNotification"에있는 모든 재로드 데이터와 b) AwakeFromNib에서 Observer를 ViewDidLoad로 이동 a) - 작동했지만 관찰자를 ViewDidLoad로 이동해도 도움이되지 않았다. 그러나 AwakeFormNib에있는 관찰자를 갖는 지점 a) +가 작동합니다. 이제 알림 된 항목이 내 tableview에 표시됩니다. 감사! 그러나 나는 우주 문제로 인해 위 질문에 대한 편집으로 게시하고있는 다른 문제에 직면하고 있습니다. 당신이 그 것에 입력을 던질 수 있다면 고맙겠습니다. 감사! –