У меня приложение iPhone подключается к серверу с использованием OAuth. При успехе он извлекает пользователя с сервера. Опять же, после успеха он добавляет элемент в массив объектов, который заполняет представление таблицы. Вот код, который делает это:iOS: добавление данных в табличное представление по специальному методу
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
if (editing) {
[super setEditing:YES animated:YES];
self.backButton = self.navigationItem.leftBarButtonItem;
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(signInWithCatapult)];
self.navigationItem.leftBarButtonItem = leftButton;
} else {
[super setEditing:NO animated:YES];
self.navigationItem.leftBarButtonItem = self.backButton;
}
}
- (void)signInWithCatapult
{
[self signOut];
GTMOAuth2Authentication *auth = [self catapultAuthenticaiton];
NSURL *authURL = [NSURL URLWithString:@"https://oauth.lvh.me:3000/oauth/authorize"];
GTMOAuth2ViewControllerTouch *viewController;
viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:auth
authorizationURL:authURL
keychainItemName:kCatapultKeychainItemName
delegate:self
finishedSelector:@selector(viewController:finishedWithAuth:error:)];
[[self navigationController] pushViewController:viewController animated:YES];
}
- (GTMOAuth2Authentication *)catapultAuthenticaiton
{
NSURL *tokenURL = [NSURL URLWithString:kDoorkeeperTokenURL];
NSString *redirectURI = @"https://catapultcentral.com/iOSClientCallback";
GTMOAuth2Authentication *auth;
auth = [GTMOAuth2Authentication authenticationWithServiceProvider:@"Catapult Central"
tokenURL:tokenURL
redirectURI:redirectURI
clientID:kDoorkeeperClientID
clientSecret:kDoorkeeperClientSecret];
return auth;
}
- (void)signOut
{
}
- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController
finishedWithAuth:(GTMOAuth2Authentication *)auth
error:(NSError *)error
{
if (error != nil) {
#if DEBUG
NSLog(@"ERROR: %@", error);
#endif
} else {
NSURL *url = [NSURL URLWithString:@"https://api.lvh.me:3000/api/users/me"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
GTMHTTPFetcher *fetcher = [GTMHTTPFetcher fetcherWithRequest:request];
[fetcher setAuthorizer:auth];
[fetcher beginFetchWithDelegate:self didFinishSelector:@selector(currentUserFetcher:finishedWithData:error:)];
}
}
- (void)currentUserFetcher:(GTMHTTPFetcher *)fetcher
finishedWithData:(NSData *)data
error:(NSError *)error
{
if (error != nil) {
#if DEBUG
NSLog(@"ERROR: %@", error);
#endif
} else {
NSLog(@"Before: %@", self.accounts);
[self.tableView beginUpdates];
[self.accounts addObject:@"Success!!!"];
[self.tableView endUpdates];
// [self.tableView reloadData];
NSLog(@"After %@", self.accounts);
}
}
Это в currentUserFetcher:finishedWithData:error:
методе, который я добавить объект в self.accounts
изменяемого массива. Теперь, если я использую этот код не работает:
[self.tableView beginUpdates];
[self.accounts addObject:@"Success!!!"];
[self.tableView endUpdates];
Он терпит неудачу на линии [self.tableView endUpdates];
со следующим сообщением об ошибке:
2013-03-28 08:56:21.040 Catapult for iOS[55012:c07] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:1054
А на endUpdates
линии, XCode жалуется говоря Thread 1: breakpoint 1.3
. Теперь, если я использую этот код, он работает нормально:
[self.accounts addObject:@"Success!!!"];
[self.tableView reloadData];
Теперь я подозреваю, что это не удается, потому что я добавить объект переменной в self.accounts
инстанции, но я на самом деле не добавить ячейку. Так что мой вопрос: Как добавить ячейку в таблицуView из метода currentUserFetcher:finishedWithData:error:
?
Как я указал в вопросе, если я использую '[self.tableView reloadData]', он отлично работает. Идея состоит в том, чтобы использовать '[self.tableView beginUpdates]' и '[self.tableView endUpdates]', но если я использую это в своем коде, это не сработает ... –
И почему вы хотите его спроектировать? Насколько я знаю, это не обычный способ создания табличных представлений. –
Когда я аутентифицирую приложение с помощью OAuth, я по существу добавляю учетную запись. После добавления учетной записи мне нужно добавить ячейку таблицы в представление таблицы. Если бы я сразу же добавил аккаунт, я мог бы спроектировать его по-другому, но мне нужно динамически добавлять таблицу. У меня есть другой способ разработки приложения для достижения того, что я хочу сделать, тогда вы можете предложить что-нибудь лучше. Я разработал его таким образом, потому что я не знаю лучше ... –