0

main.m、CGOAuth.h、CGOAuth.m ( https://github.com/guicocoa/cocoa-oauthから取得)の 3 つのファイルがあります。

main.m で (メイン メソッドで) 呼び出します。

 [GCOAuth URLRequestForPath:@"websites" 
  HTTPMethod:@"GET" 
  parameters:nil scheme:@"https" 
  host:@"blah"           
  consumerKey:CONSUMER_KEY 
  consumerSecret:CONSUMER_SECRET 
  accessToken:accessToken 
  tokenSecret:tokenSecret];

私が得るエラーは、セレクター URLRequestforPath... のクラスメソッドがないということです。

main.m にインポートした GCOAuth.h には、次の宣言があります。

 + (NSURLRequest *)URLRequestForPath:(NSString *)path
                     HTTPMethod:(NSString *)HTTPMethod
                     parameters:(NSDictionary *)parameters
                         scheme:(NSString *)scheme
                           host:(NSString *)host
                    consumerKey:(NSString *)consumerKey
                 consumerSecret:(NSString *)consumerSecret
                    accessToken:(NSString *)accessToken
                    tokenSecret:(NSString *)tokenSecret;

実装は GCOAuth.m にあります。

私はこれをやってみました:

[[GCOAuth alloc] URLRequestForPath:@"websites" 
  HTTPMethod:@"GET" 
  parameters:nil scheme:@"https" 
  host:@"blah"           
  consumerKey:CONSUMER_KEY 
  consumerSecret:CONSUMER_SECRET 
  accessToken:accessToken 
  tokenSecret:tokenSecret];

しかし、エラーが表示されます: no visible @interface はセレクター URLRequestForPath... を宣言しません。

何が間違っているのかわかりません。セレクターのクラス メソッドがない場合、Xcode のオートコンプリートが使用できるメソッドを提供するのはなぜですか?

EDIT(これはCGOAuth.mからの実装です):

 + (NSURLRequest *)URLRequestForPath:(NSString *)path
                     HTTPMethod:(NSString *)HTTPMethod
                     parameters:(NSDictionary *)parameters
                         scheme:(NSString *)scheme
                           host:(NSString *)host
                    consumerKey:(NSString *)consumerKey
                 consumerSecret:(NSString *)consumerSecret
                    accessToken:(NSString *)accessToken
                    tokenSecret:(NSString *)tokenSecret {
// check parameters
if (host == nil || path == nil) { return nil; }

// create object
GCOAuth *oauth = [[GCOAuth alloc] initWithConsumerKey:consumerKey
                                       consumerSecret:consumerSecret
                                          accessToken:accessToken
                                          tokenSecret:tokenSecret];
oauth.HTTPMethod = HTTPMethod;
oauth.requestParameters = parameters;

NSString *encodedPath = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *URLString = [NSString stringWithFormat:@"%@://%@%@", scheme, host, encodedPath];
if ([[HTTPMethod uppercaseString] isEqualToString:@"GET"]) {
    // Handle GET
    if ([oauth.requestParameters count]) {
        NSString *query = [GCOAuth queryStringFromParameters:oauth.requestParameters];
        URLString = [NSString stringWithFormat:@"%@?%@", URLString, query];
    }
}
oauth.URL = [NSURL URLWithString:URLString];

NSMutableURLRequest *request = [oauth request];
if (![[HTTPMethod uppercaseString] isEqualToString:@"GET"] && [oauth.requestParameters count]) {
    // Add the parameters to the request body for non GET requests
    NSString *query = [GCOAuth queryStringFromParameters:oauth.requestParameters];
    NSData *data = [query dataUsingEncoding:NSUTF8StringEncoding];
    NSString *length = [NSString stringWithFormat:@"%lu", (unsigned long)[data length]];
    [request setHTTPBody:data];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setValue:length forHTTPHeaderField:@"Content-Length"];
}

// return
return request;

}

Xcodeを再起動してクリーンアップするなど、私が試したもののうまくいかなかったことがいくつかあります。

(a) コード補完によって前述のメソッドの名前が表示され、(b) サイドバー (左側) の階層ビューに表示されるため、Xcode がメソッドを認識することはわかっています。時間が命!

4

1 に答える 1

0

CGOAuth.hメインクラスにインポートしましたか?CGOAuthクラスがプロジェクトのビルド フェーズに存在するかどうかを確認します。

于 2013-06-13T23:35:35.093 に答える