当数据从不同的源插入源时,TableView不会重新加载

时间:2013-06-25 08:00:07

标签: ios objective-c uitableview

我有一个ChatViewController,我发送和接收消息,并将消息存储为NSArray中的NSMutableDictionary。

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'时,两个字符串都被传递但是它不能将它添加到'messages'中,因为'Number of rows'总是为零。但是当我从该类本身存储它时,消息将被存储并且行数增加。

因此,它仅显示来自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中初始化了messages数组。但问题是当我试图从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];
        }
    }
}

3 个答案:

答案 0 :(得分:1)

当你这样做时

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

在您的app委托中,您正在实例化一个新的ChatViewController。即使messages数组在init方法中初始化(它不是,正如你所说的那样在viewDidLoad方法中初始化),ChatViewController的这个新实例也会被丢弃在xmppStream:didReceiveMessage:方法结束时,它与屏幕上显示的内容完全不同。 您需要在应用程序委托中保留对ChatViewController的正确实例的引用,并使用它而不是实例化新的... {/ p>

如果您需要有关如何解决此问题的更具体的建议,您需要向我们提供有关整个项目架构的更多详细信息(使用故事板?是否有导航控制器?标签控制器?chatviewcontroller如何与其他视图控制器等等。)。

答案 1 :(得分:0)

你需要

messages = [[NSMutableArray alloc] init];
viewdidload

中的

答案 2 :(得分:-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]);
}