0

我有一個帶有2個選項卡 - A和B的tabbar控制器。選項卡A是常規UIViewController,選項卡B是TableViewController。我試圖從後一個標籤一個NSNotification和接收相同,在選項卡B.在表中顯示的數據NS通知TableViewController不工作

我從選項卡下面張貼的通知:

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

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

在我的標籤B(TableViewController),我試圖接收上述通知更新NSMutableArray屬性。該物業的聲明如下:

標籤乙 - h文件:

@property (nonatomic,strong) NSMutableArray *cart; 

標籤乙 - .m文件:

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

現在,我已經把代碼用於接收通知(在標籤B)在AwakeFromNib如下:

- (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]; 


} 

現在,這是我面臨的問題:

我張貼在選項卡中的通知後,Tab鍵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; 
} 

所以基本上,我訪問我的TableViewController的性質(即我接受了,並從通知更新)從數據源的方法,它沒有返回數據。

您能否讓我知道我在這裏失去了什麼以及什麼。

謝謝, 邁克

編輯:繼從@Joel,@馬丁,響應@mkirci

添加重裝數據到我的 「addCurrentItemToCartFromNotification」(方法被稱爲在接到通知後)的幫助。我現在能夠看到從我的選項卡B(TableViewController)通知收到的項目。

現在,這裏是正在發生的事情:

只要接收到通知,NSMutableArray的屬性被返回零。因此,每次收到通知時,alloc init都會發生NSMutableArray屬性(位於addCurrentItemToCartFromNotification上) - (而不僅僅是第一次)。因此,不是使用從通知接收到的對象增加數組,而是每次創建數組,並且只添加當前通知的對象。

請問您能否對此情況進行一些解釋。感謝你的迴應。

謝謝, 邁克

EDIT2

更新代碼添加項目後,剪斷了initwithnibname的建議從@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

你是不是重裝表。

只有在創建並設置數組後才能重新載入表格,添加項目時還需要進行更新。

+0

...或者使用'insertRowsAtIndexPaths',它給出一個更好的動畫。 –

+0

@mkirci - 你的建議解決了我的問題。但是,我現在正面臨另一個問題,我作爲編輯提出了我的問題。希望你能看看它並分享你的意見。謝謝! –

+0

@MikeG你發佈的代碼應該可以工作,也許你在別處指定了一個你不希望執行的值爲零的值? – mkirci

1

我看到幾個問題。首先,將對象添加到數據數組時,不會調用您的自定義設置器。它只會在你自己創建NSArray時被調用,而不會添加或刪除數組中的條目。所以你應該放棄你的自定義setter,並在addCurrentItemToCartFromNotification通知中調用reloadData。

此外,你應該在viewDidLoad中添加觀察器,並將其在viewDidUnload中刪除,而不是awakeFromNib(在某些情況下不調用)。

+0

有關二傳手方法的好消息! - 但是'viewDidUnload'不是註銷觀察者的好地方,因爲iOS 6中不再調用該方法。 –

+0

有趣。我還沒有完成任何iOS 6項目,這對我來說是新聞。好點子。那麼它現在處理dealloc? – Joel

+0

@Joel - 我試過了你的建議:a)所有的數據都在「addCurrentItemToCartFromNotification」中重新加載數據並且b)將觀察者從AwakeFromNib移動到ViewDidLoad a) - 工作但將觀察者移動到ViewDidLoad沒有幫助。但是,點a)+讓AwakeFormNib中的觀察者正在工作。通知項現在正在我的桌面視圖中顯示。謝謝! 但是,由於篇幅限制,我現在正面臨另一個問題,作爲上述問題的編輯發佈。欣賞你是否可以把你的意見投給那個。謝謝! –