0

OAuth を使用して iPhone アプリをサーバーに接続しています。成功すると、サーバーからユーザーを取得します。ここでも、成功すると、テーブル ビューを設定するオブジェクトの配列に項目が追加されます。これを行うコードは次のとおりです。

- (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インスタンス変数に追加するが、実際にはセルを追加しないため、失敗していると思われます。だから私の質問は:メソッドからtableViewにセルを追加するにはどうすればよいですか?currentUserFetcher:finishedWithData:error:

4

1 に答える 1

0

このメソッドをオーバーライドするだけの場合:

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

[UITableView reloadData] を呼び出すだけでうまくいくはずです。UITableViewController は、("tableView:numberOfRowsInSection:" を使用して) そこにあるデータ (セル) の量を尋ねるだけで、最初に述べたメソッドを使用してすべての indexPath のセルを要求しています。

于 2013-03-28T09:06:32.597 に答える