наконец, после многих усилий, я узнал, как показать онлайн / оффлайн / нет пользователей.
Я собираюсь рассказать вам шаг за шагом, как я это сделал, так что я могу быть полезен дляменее опытные пользователи тоже ..
Шаг 1 - при нажатии кнопки чата я вызываю следующий метод -
-(void) chatFacebook
{
if (appDelegate.facebook == nil)
{
appDelegate.facebook = [[[Facebook alloc] initWithAppId:_APP_ID] autorelease];
}
if (!accessToken)
{
[appDelegate.facebook authorize:[XMPPStreamFacebook permissions] delegate:self appAuth:NO safariAuth:NO];
}
else
{
[self fbDidLogin];
}
}
шаг 2 - Теперь его времядля входа в систему методов делегирования диалога, если вход успешен, вызывается fbDidLogin, вот методы делегата, которые вы должны включить-
#pragma mark FBLoginDialogDelegate
/ ** * Вызывается, когда пользователь успешно вошел в систему. */
- (void)fbDidLogin
{
NSLog(@"logged in.....................");
[appDelegate.facebook requestWithGraphPath:@"me" andDelegate:self];
DDLogVerbose(@"%s accessToken: %@ expirationDate: %@",__PRETTY_FUNCTION__,appDelegate.facebook.accessToken,appDelegate.facebook.expirationDate);
self.accessToken = appDelegate.facebook.accessToken;
if (xmppStream) {
[xmppStream release];
xmppStream = nil;
}
xmppStream = [[XMPPStreamFacebook alloc] init];
xmpReconnect = [[XMPPReconnect alloc] initWithStream:xmppStream];
if (xmppRosterStorage) {
[xmppRosterStorage release];
xmppRosterStorage = nil;
}
xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
if (xmppRoster) {
[xmppRoster release];
xmppRoster = nil;
}
xmppRoster = [[XMPPRoster alloc] initWithStream:xmppStream rosterStorage:xmppRosterStorage];
[xmppStream addDelegate:self];
[xmppRoster addDelegate:self];
[xmppRoster setAutoRoster:YES];
xmppStream.myJID = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@chat.facebook.com", uid]];
// You may need to alter these settings depending on the server you're connecting to
allowSelfSignedCertificates = NO;
allowSSLHostNameMismatch = YES;
// Uncomment me when the proper information has been entered above.
NSError *error = nil;
if (![xmppStream connect:&error])
NSLog(@"Error connecting: %@", error);
if(!tableView)
{
tableView = [[UITableView alloc]initWithFrame:CGRectMake(0,0, 480, 320) style:UITableViewStylePlain];
}
[tableView setFrame:CGRectMake(0,0, 480, 320)];
[tableView setTag:2];
[tableView setDelegate:self];
[tableView setDataSource:self];
[tableView setHidden:NO];
[tableView setBackgroundColor:[UIColor clearColor]];
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[tableView setAlpha:1.0];
[self.view addSubview:tableView];
[self.tableView reloadData];
[self showTopBar];
}
/ ** * Вызывается, когда пользователь закрывает диалоговое окно без входа в систему. * /
- (void)fbDidNotLogin:(BOOL)cancelled
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Canceled" message:@"Login cancled" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
/ ** * Вызывается припользователь вышел из системы.* /
- (void)fbDidLogout
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Logged out" message:@"Logged out" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
Шаг 3 - Вторая строка метода fbDidLogin вызывает методы FBRequestDelegate, поэтому вы должны включить этот протокол в ваш класс .h, чтобы получить идентификатор пользователя (который вошел в систему,означает текущего пользователя) вам нужно реализовать следующие методы:
прагма
прагма * FBRequestDelegate
- (void)request:(FBRequest*)request didFailWithError:(NSError*)error{
DDLogError(@"%s %@",__PRETTY_FUNCTION__,error);
//[appDelegate.facebook logout:self];
}
/ ** * Вызывается при возврате запроса и егоответ был разобран в объект.* Полученный объект может быть словарем, массивом, строкой или числом, * в зависимости от формата ответа API.* /
- (void)request:(FBRequest*)request didLoad:(id)result {
DDLogVerbose(@"%s............DDLOG................... %@",__PRETTY_FUNCTION__,result);
NSLog(@" Result>>>>-------%@", result);
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:(NSMutableDictionary *)result];
uid = [dict objectForKey:@"id"];
NSLog(@"iddddddddddddd---%@", uid);
}
Шаг 4 - Теперь представляем методы табличного представления DataSource и Delegate, вам необходимо реализовать их, вот методы -
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView1
{
return [[[self fetchedResultsController] sections] count];
//, необходимые для реализации NSFetchedResultsControllerDelegate}
- (NSString *)tableView:(UITableView *)sender titleForHeaderInSection:(NSInteger)sectionIndex
{NSArray * section = [[self fetchedResultsController] section];
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 *)tableView1 numberOfRowsInSection:(NSInteger)sectionIndex
{
NSArray *sections = [[self fetchedResultsController] sections];
if (sectionIndex < [sections count])
{
id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:sectionIndex];
return sectionInfo.numberOfObjects;
NSLog(@"section ifnfo ===========%@", sectionInfo);
}
}
return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
}
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];
user = [[self fetchedResultsController] objectAtIndexPath:indexPath];
cell.textLabel.text = user.displayName;
cell.textLabel.textColor = [UIColor whiteColor];
cell1 = cell;
}
Шаг 5. Наконец, вам также необходимо реализовать делегат NSFetchedResultsControllerметоды, чтобы вы могли заполнить таблицу пользователями чата, вот методы-
- (NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController == nil)
{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorage"
inManagedObjectContext:[self managedObjectContext]];
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:[self managedObjectContext]
sectionNameKeyPath:@"sectionNum"
cacheName:nil];
[fetchedResultsController setDelegate:self];
[sd1 release];
[sd2 release];
[fetchRequest release];
NSError *error = nil;
if (![fetchedResultsController performFetch:&error])
{
NSLog(@"Error performing fetch: %@", error);
}
}
return fetchedResultsController;
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[[self tableView] reloadData];
}
Шаг 6 - Скомпилируйте и запустите ваш код, список пользователей должен появиться в виде таблицы
, еслиВозникли какие-либо проблемы, пожалуйста, поделитесь, я всегда здесь, чтобы помочь вам. И, пожалуйста, не возражайте, если есть какие-то ошибки при публикации этого ответа, я пишу только в третий раз
Спасибо.