我有一个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];
}
}
}
答案 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]);
}