2013-06-25 50 views
0

我有一個ChatViewController,用於發送和接收消息並將消息作爲NSMutableDictionary存儲在NSArray中。當數據插入到不同源的數據源時,TableView不會重新加載

NSMutableArray *messages; //in header file 

- (void)addMessage:(NSString *)receivedMessage :(NSString *) sender 
{ 
    [self reloadDataInTableView:receivedMessage :sender]; 
} 

- (void)reloadDataInTableView:(NSString *)message :(NSString*)sender 
{ 
    NSLog(@"Text: %@ Sender: %@", message, sender); 
    NSMutableDictionary *m = [[NSMutableDictionary alloc] init]; 
    [m setObject:message forKey:@"msg"]; 
    [m setObject:sender forKey:@"sender"]; 
    [messages addObject:m]; 
    [self.tView reloadData]; 
    NSLog(@"Number of rows: %d", [messages count]); 
} 

當我打電話從AppDelegate中「方法addMessage」,這兩個字符串傳遞,但不能將其添加到「消息」,因爲「行數」始終是零。但是當我從這個類自己存儲它時,這些消息就會被存儲並且行數會增加。

因此,它只顯示來自ChatViewController的消息,而不顯示從AppDelegate發送的消息。我希望我能夠正確地解釋這個問題。

這裏是的cellForRowAtIndexPath功能:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSMutableDictionary *s = (NSMutableDictionary *) [messages objectAtIndex:indexPath.row]; 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
     //cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier]; 
    } 

    cell.textLabel.text = [s objectForKey:@"msg"]; 
    cell.detailTextLabel.text = [s objectForKey:@"sender"]; 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    cell.userInteractionEnabled = NO; 
    return cell; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return [messages count]; 

} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    return 1; 

} 

是,我已初始化在viewDidLoad中的消息數組。但問題是,當我試圖從AppDelegate插入到消息數組中時,計數不會增加。實際上,它總是顯示零。但是當我從ViewController本身插入時,它會保持計數。這裏是AppDelegate的代碼:

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message 
{ 
    if ([message isChatMessageWithBody]) 
    { 
     XMPPUserCoreDataStorageObject *user = [xmppRosterStorage userForJID:[message from] 
                   xmppStream:xmppStream 
                 managedObjectContext:[self managedObjectContext_roster]]; 

     NSString *messageBody = [[message elementForName:@"body"] stringValue]; 
     NSString *displayName = [user jidStr]; 

     if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive) 
     { 
      ChatViewController *cvc = [[ChatViewController alloc] init]; 
      [cvc reloadDataInTableView:messageBody :displayName]; 
     } 
     else 
     { 
      // We are not active, so use a local notification instead 
      UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
      localNotification.alertAction = @"Ok"; 
      localNotification.alertBody = [NSString stringWithFormat:@"From: %@\n\n%@",displayName,messageBody]; 

      [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; 
     } 
    } 
} 
+0

你的NSMutableArray初始化了嗎? – Karl

+0

是的,你在哪裏初始化數組'messages'? – micantox

+1

你是如何從AppDelegate發送的?給那個代碼。 – Durgaprasad

回答

-1

試試這個:

- (void)reloadDataInTableView:(NSString *)message :(NSString*)sender 
{ 
    NSLog(@"Text: %@ Sender: %@", message, sender); 
    NSMutableDictionary *m = [[NSMutableDictionary alloc] init]; 
    [m setObject:message forKey:@"msg"]; 
    [m setObject:sender forKey:@"sender"]; 
    if (!messages) 
    { 
     messages = [[NSMutableArray alloc] init]; 
    } 
    [messages addObject:m]; 
    [self.tView reloadData]; 
    NSLog(@"Number of rows: %d", [messages count]); 
} 
+1

這是一個很好的習慣,從getter懶惰初始化屬性,而不是從一個隨機的方法。 – micantox

0

你需要

messages = [[NSMutableArray alloc] init]; 

viewdidload

+0

我已添加編輯。順便說一句,我已經初始化數組。 – Jyotiska

1

當你

ChatViewController *cvc = [[ChatViewController alloc] init]; 
[cvc reloadDataInTableView:messageBody :displayName]; 

在您的應用程序委託中,您正在實例化一個新的ChatViewController。即使messages數組在初始化方法中初始化(它不是,正如您所說的,它在viewDidLoad方法中初始化),ChatViewController的這個新實例在xmppStream:didReceiveMessage:方法的末尾被丟棄,並且絕對不是與屏幕上顯示的相同。 你需要保持到ChatViewController正確的實例的引用,在您的應用程序委託並使用,而不是實例化一個新的...

如果你想對如何處理這個問題的一些更具體的建議,你會需要給我們提供關於整個項目架構的更多細節(使用storyboard?是否有導航控制器?tab控制器?chatviewcontroller如何與其他視圖控制器相關?等等)。

+0

你能詳細說明一下嗎?我仍然無法解決問題。 – Jyotiska

+0

查看我的編輯,我需要更多關於您整個項目架構的細節,以便爲您提供關於如何解決問題的更具體的建議! – micantox

+0

我想根據以下XMPP框架製作聊天客戶端:https://github.com/robbiehanson/XMPPFramework/tree/master/Xcode/iPhoneXMPP – Jyotiska

相關問題