dismissModalViewControllerAnimated устарела

Я только что перешел на XCode 4.5, чтобы обновить приложение iOS для 4-дюймового дисплея для iPhone 5, но получаю сообщение об ошибке сборкиdismissModalViewControllerAnimated:' is deprecated на линии:

[self dismissModalViewControllerAnimated:NO];

Я пытался обновить до рекомендованной перегрузки с помощью обработчика завершения (но со значением NULL) следующим образом:

[self dismissModalViewControllerAnimated:NO completion:NULL];

Но тогда эта строка выдает две ошибки:

warning: 'TabBarController' may not respond to '-presentModalViewController:animated:completion:'
Instance method '-presentModalViewController:animated:completion:' not found (return type defaults to 'id')

Спасибо!

Ответы на вопрос(6)

я поместил его в селектор вот так:

if ([self respondsToSelector:@selector(dismissModalViewControllerAnimated:)]) {
    [self performSelector:@selector(dismissModalViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES]];
} else {
    [self dismissViewControllerAnimated:YES completion:nil];
}

Это приносит пользу людям с ОКР, как и я;)

 28 июл. 2013 г., 00:25
Вы должны переключить оператор if, потому что я считаю, что устаревший метод не вызоветrespondsToSelector вернуть ложь. Таким образом, новыйdismissViewControllerAnimated: никогда не будет вызываться до будущего обновления, где они могут удалитьdismissModalViewControllerAnimated: в целом.

[self dismissModalViewControllerAnimated:NO]; был объявлен устаревшим

использование[self dismissViewControllerAnimated:NO completion:nil]; вместо.

[[Picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];

Вместо:

[[Picker parentViewControl] dismissModalViewControllerAnimated:YES];

... и вы можете использовать:

[self presentViewController:picker animated:YES completion:nil];

Вместо

[self presentModalViewController:picker animated:YES];    

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

if ([self respondsToSelector:@selector(presentModalViewController:animated:)]) {
    [self performSelector:@selector(presentModalViewController:animated:) withObject:testView afterDelay:0];
} else {
    [self presentViewController:configView animated:YES completion:nil];
}
[testView.testFrame setImage:info]; //this doesn't work for performSelector
[testView.testText setHidden:YES];

Я использовал ViewController «в общем». и был в состоянии заставить модальное Представление появляться по-разному в зависимости от того, что это было вызвано, чтобы сделать (используя setHidden и setImage). и раньше все работало хорошо, но executeSelector игнорирует 'set & apos; вещи, так что, в конце концов, это будет плохим решением, если вы попытаетесь быть эффективными, как я пытался

использование

[self dismissViewControllerAnimated:NO completion:nil];
Решение Вопроса

Новый метод:

[self dismissViewControllerAnimated:NO completion:nil];

Словоmodal был удален; Как это было для представления вызова API:

[self presentViewController:vc animated:NO completion:nil];

Причины были обсуждены в2012 WWDC Session 236 - The Evolution of View Controllers on iOS Видео. По сути, контроллеры представления, представленные этим API, больше не всегда являются модальными, и, поскольку они добавляли обработчик завершения, пришло время переименовать его.

В ответ на комментарий от Марка:

What's the best way to support all devices 4.3 and above? The new method doesn't work in iOS4, yet the old method is deprecated in iOS6.

Я понимаю, что это почти отдельный вопрос, но я думаю, что стоит упомянуть, поскольку не у всех есть деньги на обновление всех своих устройств каждые 3 года, поэтому у многих из нас есть некоторые старые (до 5.0) устройства. Тем не менее, насколько мне больно это говорить, вы должны подумать, стоит ли ориентироваться ниже 5,0. Есть много новых и интересных API, не доступных ниже 5.0. И Apple постоянно усложняет им задачу; Поддержка armv6 удалена из Xcode 4.5, например.

Для достижения цели ниже 5.0 (пока блок завершения равен нулю) просто используйте удобныйrespondsToSelector: метод.

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [self presentViewController:test animated:YES completion:nil];
} else {
    [self presentModalViewController:test animated:YES];
}

В ответ на еще один комментарий от Марка:

That could be quite a lot of If statements in my application!...I was thinking of creating a category that encapsulated this code, would creating a category on UIViewControler get me rejected?

и один из Полного Приличного:

...is there a way to manually cause that to not present a compiler warning?

Во-первых, нет, создание категории наUIViewController само по себе ваше приложение не будет отклонено; если этот метод категории не называется частными API или чем-то подобным.

Метод категорий является чрезвычайно хорошим местом для такого кода. Кроме того, поскольку в устаревшем API будет только один вызов, будет только одно предупреждение компилятора.

Чтобы ответить на комментарий (вопрос) Full Decent, вы можете подавить предупреждения компилятора вручную.Вот ссылка на ответ на SO на эту тему, Метод категории также является отличным местом для подавления предупреждения компилятора, поскольку вы подавляете предупреждение только в одном месте. Вы, конечно же, не хотите, чтобы компилятор заставлял молчать компилятор.

Если бы я должен был написать простой метод категории для этого, это могло бы быть что-то вроде этого:

@implementation UIViewController (NJ_ModalPresentation)
-(void)nj_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion{
    NSAssert(completion == nil, @"You called %@ with a non-nil completion. Don't do that!",NSStringFromSelector(_cmd));
    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
        [self presentViewController:viewControllerToPresent animated:flag completion:completion];
    } else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
        [self presentModalViewController:viewControllerToPresent animated:flag];
#pragma clang diagnostic pop
    }
}
@end
 21 мая 2013 г., 00:11
Для кодаif ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ [self presentViewController:test animated:YES completion:nil]; } else { [self presentModalViewController:test animated:YES]; } Есть ли способ вручную вызвать это, чтобы не отображать предупреждение компилятора?
 22 мая 2013 г., 16:08
@FullDecent Да, вы можете. Я отредактировал свой ответ с некоторой информацией об этом.
 26 сент. 2012 г., 01:14
@ Марк я добавил к своему ответу, чтобы решить вашу проблему.
 24 сент. 2012 г., 18:30
Какой наилучший способ поддержки всех устройств 4.3 и выше? Новый метод не работает в iOS4, но старый метод устарел в iOS6. Рок и тяжелое место?
 26 сент. 2012 г., 10:44
Благодарю. Это может быть довольно много заявлений If в моем приложении! Я предполагаю, что тот же подход мог бы работать при использовании «modalViewController» имущество. Я думал о создании категории, которая инкапсулирует этот код. Может ли создание категории в UIViewControler меня отвергнуть?

Ваш ответ на вопрос