IOS XMPP如何使用特定用户名和聊天进入下一个控制器
Posted
技术标签:
【中文标题】IOS XMPP如何使用特定用户名和聊天进入下一个控制器【英文标题】:IOS XMPP how to go next controller with particular username and chat 【发布时间】:2015-06-03 07:19:21 【问题描述】:我正在从事 XMPP 项目。我已成功完成登录过程和在线离线名册。但现在我不知道如何转到具有特定用户字段的下一个视图控制器并与他聊天。这是我的尝试。 现在我要在 UITableview 的委托方法中写什么
friendsviewcontroller.m file // Fetch online and offline rosterlist
#pragma mark -Tableview datasource method
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [[[self fetchedResultsController] sections] count];
- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
switch (indexPath.row)
case 0:
if(indexPath.section==0)
return 60.0; // first row is 123pt high
default:
return 60.0; // all other rows are 40pt high
- (NSString *)tableView:(UITableView *)sender titleForHeaderInSection:(NSInteger)sectionIndex
NSArray *sections = [[self fetchedResultsController] sections];
if (sectionIndex < [sections count])
id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:sectionIndex];
int section = [sectionInfo.name intValue];
switch (section)
case 0 : return @"Available";
case 1 : return @"Away";
default : return @"Offline";
return @"";
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex
NSArray *sections = [[self fetchedResultsController] sections];
if (sectionIndex < [sections count])
id <NSFetchedResultsSectionInfo> sectionInfo = sections[sectionIndex];
return sectionInfo.numberOfObjects;
return 0;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"SimpleTableItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if( cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpleTableIdentifier];
XMPPUserCoreDataStorageObject *user = [[self fetchedResultsController] objectAtIndexPath:indexPath];
cell.textLabel.text = user.displayName;
[self configurePhotoForCell:cell user:user];
// cell.detailTextLabel.text= [self.tblchathistory objectAtIndex:indexPath.row];
cell.textLabel.textColor=[UIColor whiteColor];
return cell;
#pragma Mark - segue method
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"chathistory"])
CreateGroupViewController *vc = [segue destinationViewController];
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
NSXMLElement *queryElement = [iq elementForName: @"query" xmlns: @"jabber:iq:roster"];
if (queryElement)
NSArray *itemElements = [queryElement elementsForName: @"item"];
for (int i=0; i<[itemElements count]; i++)
NSLog(@"Friend: %@",[[itemElements[i] attributeForName:@"jid"]stringValue]);
return NO;
- (NSFetchedResultsController *)fetchedResultsController
if (fetchedResultsController == nil)
NSManagedObjectContext *moc = [[self appDelegate] managedObjectContext_roster];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject"
inManagedObjectContext:moc];
NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setFetchBatchSize:10];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"sectionNum"
cacheName:nil];
[fetchedResultsController setDelegate:self];
NSError *error = nil;
if (![fetchedResultsController performFetch:&error])
DDLogError(@"Error performing fetch:= %@", error);
//NSLog(@"error = %@", error);
return fetchedResultsController;
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
[[self tblvwbuddy] reloadData];
【问题讨论】:
【参考方案1】:您可以通过以下方式获取用户
当您在一个屏幕中显示时,这意味着您拥有用户的 jid,因此请获取该用户的 jid,然后在下一个控制器中您可以过滤用户。
这是我通过 jid 从XMPPUserCoreDataStorageObject
过滤特定用户的代码。在我的情况下,friendJid
是要过滤的 jid
- (XMPPUserCoreDataStorageObject *)fetchTheUser
NSManagedObjectContext *moc = [APP_DELEGATE managedObjectContext_roster];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject"
inManagedObjectContext:moc];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"jidStr=%@",[self.friendJid lowercaseString]];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:pred];
NSError *error = nil;
[fetchRequest setPredicate:pred];
NSArray *fetchedObjects = [[APP_DELEGATE managedObjectContext_roster] executeFetchRequest:fetchRequest error:&error];
XMPPUserCoreDataStorageObject *objTemp = fetchedObjects.count?[fetchedObjects objectAtIndex:0]:nil;
return objTemp;
希望对您有所帮助。 觉得有用就采纳答案
【讨论】:
所以我必须在我的下一个视图控制器中编写这段代码? 此代码用于获取特定用户,您可以根据需要使用它。我想根据您的要求,您可以在下一个控制器中使用它 对不起菜鸟问题。在我的情况下,过滤的 jid 是什么? 正如你所说,你已经在一个控制器中显示了所有用户,当你在那里显示它时,你有该用户的 id(=i.e jid)。假设您在表格中显示它,然后在“didselect 方法”中您可以获得索引来获取 jid。 是的。你可以解决我的问题。我不知道我必须在 UItable 委托 didselect 方法中声明什么。所以,我可以使用人的用户名移动到下一个视图控制器。以上是关于IOS XMPP如何使用特定用户名和聊天进入下一个控制器的主要内容,如果未能解决你的问题,请参考以下文章
xmpp ios:如何从 openfire 服务器检索所有注册用户
如何使用 xmpp 框架和 openfire 服务器将电话簿联系人添加到 ios 中的聊天应用程序?