2013-03-28 2 views
0

У меня приложение 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:?

ответ

0

Если вы просто переопределить этот метод:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

Вызов [UITableView reloadData] должно работать вне. UITableViewController будет просто запрашивать количество данных (ячеек), которые есть (используя «tableView: numberOfRowsInSection:») и запрашивает Cell для каждого indexPath, используя первый упомянутый метод.

+0

Как я указал в вопросе, если я использую '[self.tableView reloadData]', он отлично работает. Идея состоит в том, чтобы использовать '[self.tableView beginUpdates]' и '[self.tableView endUpdates]', но если я использую это в своем коде, это не сработает ... –

+0

И почему вы хотите его спроектировать? Насколько я знаю, это не обычный способ создания табличных представлений. –

+0

Когда я аутентифицирую приложение с помощью OAuth, я по существу добавляю учетную запись. После добавления учетной записи мне нужно добавить ячейку таблицы в представление таблицы. Если бы я сразу же добавил аккаунт, я мог бы спроектировать его по-другому, но мне нужно динамически добавлять таблицу. У меня есть другой способ разработки приложения для достижения того, что я хочу сделать, тогда вы можете предложить что-нибудь лучше. Я разработал его таким образом, потому что я не знаю лучше ... –

Смежные вопросы