2016-01-08 3 views
-2

Существует метод этого делегата:NSDictionary возвращает только один объект

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url  
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation 
{ 
    return [[FBSDKApplicationDelegate sharedInstance] application:application 
                  openURL:url 
               sourceApplication:sourceApplication 
                 annotation:annotation]; 
} 

... но это не рекомендуется, поэтому я заменил его с помощью этого метода:

- (BOOL)application:(UIApplication *)app 
      openURL:(NSURL *)url 
      options:(NSDictionary<NSString *,id> *)options 
{ 
    return [[FBSDKApplicationDelegate sharedInstance] application:app 
                  openURL:url 
               sourceApplication:options//Only string 
                 annotation:options];//id 
} 

Как взять из NSDictionary только строковый объект и аналогично id.

+0

Прочитайте документацию для приложения UIApplicationDelegate: openURL: options: '. Посмотрите, что он говорит о параметре 'options'. – rmaddy

+0

См. Также: [Проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – jtbandes

ответ

0

Вы можете войти или отладки внутри метода и увидеть значения.

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 
    NSLog(@"sourceApplication: %@,annotation: %@",sourceApplication,annotation); 
    //return ... 
} 

Бревно: sourceApplication: com.apple.SafariViewService,annotation: (null)

И остается метод:

-(BOOL) application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{ 
NSLog(@"%@", options); 
//return ... 

}

Бревно:

UIApplicationOpenURLOptionsOpenInPlaceKey = 0; 
    UIApplicationOpenURLOptionsSourceApplicationKey = "com.apple.SafariViewService"; 

Таким образом, вы можете заменить код

return [[FBSDKApplicationDelegate sharedInstance] application:app 
                  openURL:url 
               sourceApplication:[options valueForKey:@"UIApplicationOpenURLOptionsSourceApplicationKey"] 
                 annotation:nil]; 

Но я думаю, что с помощью первого метода в порядке, не нужно использовать этот метод: D Или вы можете прочитать больше о компании Apple документации по этой ссылке:

Счастливый кодирования;

+0

Нет, это неправильно. 1) Не используйте 'valueForKey:', чтобы получить значение из словаря. Используйте 'objectForKey:', если у вас нет четкой и конкретной причины использовать KVC. 2) Не перекодируйте ключ в виде строки. iOS обеспечивает правильную константу для этого ключа. См. 'UIApplicationOpenURLOptionsSourceApplicationKey'. Поэтому правильным синтаксисом для получения исходного приложения из 'options' является:' options [UIApplicationOpenURLOptionsSourceApplicationKey] '. – rmaddy

+0

И этот ответ пренебрег, чтобы показать, как получить аннотацию из 'options'. – rmaddy

+0

@maddy Да, я вижу. Это просто временное мышление, а не хорошее, спасибо за совет. –

0

Это синтаксис универсальных генераторов Objective C. Эта функция в основном включена для исправления проблем совместимости Objective C - Swift.

NSDictionary<NSString *,id> означает, что словарные ключи должны иметь тип NSString, а его значение может быть любым типом объекта (id).

Ниже приведен пример получения значений от NSDictionary<NSString *,id>. Надеюсь, это поможет вам извлечь объект и идентификатор NSString в соответствии с ответом, который вы получаете от входа в Facebook.

//Assign Generic Value. 
    float fltT = 98564.5f; 
    NSMutableDictionary<NSString *, id> *_generic; 
    _generic = [[NSMutableDictionary alloc] init]; 
    _generic[@"genericValue"] = [NSNumber numberWithFloat:fltT]; 
    NSLog(@"Assigned Generic Value:%@",_generic); 

    //Access generic values from NSMutableDictionary 
    NSLog(@"Access Generic Value:%@",_generic[@"genericValue"]); 

Вот лог вывода: -

enter image description here

+0

Что этот ответ имеет отношение к вопросу? Вопрос заключается в том, как использовать вторую форму метода делегирования приложения, указанную в вопросе. – rmaddy

+0

Возможно, вы не заметили, что вторая форма имеет аргумент NSMutableDictionary *, где он хочет извлечь строку и идентификатор, я показал, как он может извлечь эти вещи с идеальным выходом. Пожалуйста, просмотрите вопрос. – KiranJasvanee

+0

Но ваш ответ вообще не связан с вопросом. Поместите свой ответ в контексте кода в вопросе. Покажите, как получить требуемые значения из словаря 'options', переданного методу делегата приложения. – rmaddy

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