1

クラス A とクラス B の 2 つのクラスがあります。クラス A にはチャットとは関係のないミッションがありますが、チャット メッセージの到着に反応する必要があります。メッセージが到着すると、メッセージは NSMutableDictionary に格納されます。これは、NSMutableArray に格納されている辞書です。受信したメッセージが最初のもの ([array count]==1) である場合、クラス B ビューが表示され、UITableView が表示され、データに配列が取り込まれます。すべてが最初のメッセージに対して完全に機能します。

2 番目のメッセージが到着します。新しいメッセージが配列に追加されますが (これはクラス A で行われます)、テーブルにはデータが取り込まれません。どうすればその目標を達成できますか?

コード:

クラスA

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
NSString *msg = [[message elementForName:@"body"] stringValue];
NSString *from = [[message attributeForName:@"from"] stringValue];

NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
[m setObject:msg forKey:@"msg"];
[m setObject:from forKey:@"sender"];
[messarray addObject:m];


[self newMessageReceived:messarray];
}

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
NSLog(@"Method xmppStreamDidAuthenticate");
[self goOnline];
}

//- (void) newMessageReceived:(NSMutableDictionary *)message
-(void) newMessageReceived:(NSMutableArray *)messarraylocal
{
General *general = [General sharedManager];//An static class to store settings like username, and other things that must be available in the hole app.
general.numcels++;
general.messarray=messarraylocal;
  // NSString *firstmessage=[message objectForKey:@"msg"];
//NSString *from=[message objectForKey:@"sender"];    
//NSArray *listItems = [from componentsSeparatedByString:@"@"];
//NSString *fromsplit=[listItems objectAtIndex:0];
//general.firstmess=firstmessage;
//general.firstfrom=fromsplit;




if ([messarraylocal count]==1){
ChatViewController *cvc=[[ChatViewController alloc]initWithNibName:@"Chat" bundle:nil];

[[self navigationController]pushViewController:cvc animated:YES];

}
}

クラス B:

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
General *general = [General sharedManager];
NSLog(@"We are in numberOfRowsInSection, de ChatViewController");
return general.messarray.count;
}

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
General *general = [General sharedManager];

NSLog(@"We are in cellForRowAtIndexPath de ChatViewController");
//UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
//if(!cell){
messarray=general.messarray;
for (int i=0;i<messarray.count; i++)
{
    diccio=[messarray objectAtIndex:i];
    general.firstmess=[diccio objectForKey:@"msg"];
    general.firstfrom=[diccio objectForKey:@"sender"];

UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
//}
text=general.firstmess;
remite=general.firstfrom;
[[cell textLabel]setText:remite];
[[cell detailTextLabel] setText:text];

return cell;

}
}

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
NSString *msg = [[message elementForName:@"body"] stringValue];
NSString *from = [[message attributeForName:@"from"] stringValue];
NSLog(@"We are in didReceiveMessage of ChatViewController");
NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
[m setObject:msg forKey:@"msg"];
[m setObject:from forKey:@"sender"];


[self newMessageReceived:m];
}

- (void) newMessageReceived: (NSMutableDictionary *) message// this method is NEVER called
{
General *general = [General sharedManager];
general.numcels++;
NSLog(@"numcels vale %i", general.numcels);
NSString *firstmessage=[message objectForKey:@"msg"];
NSString *from=[message objectForKey:@"sender"];    
NSArray *listItems = [from componentsSeparatedByString:@"@"];
NSString *fromsplit=[listItems objectAtIndex:0];
general.firstmess=firstmessage;
general.firstfrom=fromsplit;
NSLog(@"Message receive in ChatViewController: %@ from %@", [message objectForKey:@"msg"], fromsplit);

}

クラス B の didViewLoad メソッドで、次のことを行います。

table.delegate=self;
table.dataSource=self;

しかし、結果はありません。[テーブルのリロード] が機能することはわかっていますが、どこで実行できますか?

誰でも私を助けることができますか?ありがとうございました!

4

2 に答える 2

0

newMessageReceived新しいメッセージをグローバルに追加した後のクラス Amessarray

あなたは発射する必要がありますNSNotification

-(void) newMessageReceived:(NSMutableArray *)messarraylocal
{
    //in addition to your normal code, add the following
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NewMessage" object:nil];
}

現在クラスBで観察登録中

- (void) viewDidLoad
{
    //In addition to your normal code here add the following
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newMessage) name:@"NewMessage" object:nil];
}

//Add this method that will call reload data
- (void) newMessage
{
    [table reloadData];
}
于 2012-06-15T12:53:08.703 に答える
0

Are you storing the previous message in you array... if not then in your didReceiveMessage: put one line before adding the object in array...

[messarray removeAllObjects];
于 2012-06-15T13:29:02.557 に答える