Base sdk 4.3 выдает ошибку, а 5.0 не выдает ошибки - PullRequest
1 голос
/ 19 января 2012

Моя текущая база SDK установлена ​​на iOS 4.2.У меня есть этот метод:

    - (void) setNavigationBarBackground
    {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] > 4.9) {
        //iOS 5.0
        if ([self respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
        {
            [self setBackgroundImage:[UIImage imageNamed:kImageNavBar] forBarMetrics:UIBarMetricsDefault];
        }
    }
    else
    {
        //iOS 4.whatever and below
        UIImageView *imageView = (UIImageView *)[self viewWithTag:kNavigationBarBackgroundImageTag];
        if (imageView == nil)
        {
            imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:kImageNavBar]];
            [imageView setTag:kNavigationBarBackgroundImageTag];
            [self insertSubview:imageView atIndex:0];
            [imageView release];
        }
    }
}

Когда я строю свой проект, я сталкиваюсь с ошибкой времени компиляции как:

'UIBarMetrics' Default undeclared (first use in this function)

Когда я устанавливаю свой базовый SDK на 5.0, он компилируется безлюбая ошибка.

Кто-нибудь знает, как я могу скомпилировать его, используя базовый SDK 4.2?

Ответы [ 2 ]

4 голосов
/ 21 января 2012

для конкретного случая, используйте это:

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
if ([self.navigationController.navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)]){
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"TitleBar"] forBarMetrics:UIBarMetricsDefault];
}
#endif

В общем, хороший способ условной компиляции между различными версиями SDK заключается в следующем:

поместите это сверху (вместе с импортом):

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

тогда, если есть некоторые специфические для ОС функции, используйте их вот так (я использую AlertView в качестве примера. До iOS5, UIAlertView не поддерживает собственный textView внутри, поэтому у меня был свой собственный AlertView. В iOS5 это хак не работает, и я должен использовать UIAlertView, поскольку он поддерживает пользовательские текстовые представления):

if (SYSTEM_VERSION_LESS_THAN(@"5.0")) {

TextAlertView *alert = [[TextAlertView alloc] initWithTitle:@"xxxYYzz" 
                                                    message:@"" 
                                                   delegate:self cancelButtonTitle:@"Add"
                                          otherButtonTitles:@"Cancel", nil];
alert.textField.keyboardType = UIKeyboardTypeDefault;
alert.tag = 1;
self.recipeNameTextField = alert.textField;
[alert show];
[alert release];
}
else {
     UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"xxYYzz"
                                           message:@"" 
                                           delegate:self cancelButtonTitle:@"Add"
                                  otherButtonTitles:@"Cancel", nil];
     alert.alertViewStyle = UIAlertViewStylePlainTextInput;
     self.recipeNameTextField = [alert textFieldAtIndex:0];

     [alert show];
     [alert release];
 }

Надеюсь, это поможет

0 голосов
/ 19 января 2012

Установите для «Базового SDK» значение «Последняя версия iOS».

Установите для «Целевого показателя развертывания iOS» минимальную версию, которую вы хотите поддерживать, в данном случае «iOS 4.2».

...