presentViewController:animated:NO за кратко показва представяне на контролер в iOS 8. Алтернативи?

Типично е по време на стартиране на приложението да създадете основната си структура на потребителския интерфейс, но ако потребителят не е влязъл по време на стартиране на приложението, незабавно да се представи модален екран за въведение/влизане над нормалния потребителски интерфейс.

Обикновено е добре да се представи модалният потребителски интерфейс с помощта на presentViewController:animated:NO, защото потребителят ще види: Изображение за стартиране на приложение -> потребителски интерфейс за влизане.

В iOS 8 обаче изглежда извикването на presentViewController с animated = NO все още показва за кратко основния контролер за изглед за рамка, преди да представи контролера за изглед.

Пример:

Не искам първо да представям потребителския интерфейс за влизане, защото когато потребителят влезе, аз бих представил основния потребителски интерфейс от потребителския интерфейс за вход, като по този начин поддържам потребителския интерфейс за вход в йерархията за неопределено време.

Има ли друг начин, който не съм обмислял? Могат ли сторибордовете да ми помогнат тук?


person Rizwan Sattar    schedule 05.11.2014    source източник
comment
Къде в кода ви се обаждате на presentViewController:animated:?   -  person Daniel T.    schedule 05.11.2014
comment
Моля, включете кода и кажете откъде се обаждате.   -  person jrturton    schedule 05.11.2014
comment
Здравей @DanielT, обаждам се на presentViewController по време на applicationDidFinishLaunching:withOptions.   -  person Rizwan Sattar    schedule 08.11.2014


Отговори (3)


Лично аз проверявам дали сте влезли в системата при стартиране на приложението и след това или инсталирам контролера за изглед за влизане, или основния контролер за изглед на главния изглед като контролер на изглед на основния прозорец на прозореца.

Когато потребителят влезе или излезе, основният контролер за преглед на прозореца се заменя. Това също може да бъде анимирано. Намирам този подход за доста чист.

person jrturton    schedule 05.11.2014
comment
Интересно, не знаех, че замяната на контролера на основния изглед може да бъде анимирана, като се използва [UIView transitionFromView:toView:duration:options:completion]! Това реши проблема за мен, въпреки че както каза @anna-dickinson, можете да използвате и сторибордове. - person Rizwan Sattar; 17.11.2014
comment
Използвам и сторибордове, но не с един набор като основен интерфейс в случаи като този. - person jrturton; 18.11.2014

Предполагам, че проблемът ще изчезне, ако използвате сторибордове и не инстанциирате програмно своите първоначални контролери или контролери за изглед за влизане. UIKit изглежда работи най-добре, когато просто го оставите да си свърши работата...

Ето как условно да изведете контролера за изглед за влизане с помощта на разкадровка:

https://stackoverflow.com/a/26657778/1442620

person Anna Dickinson    schedule 05.11.2014
comment
Благодаря за това! 100% съм съгласен, че не трябва да се биете с UIKit. Въпреки това, аз не Apple е постановила, че сторибордовете са необходими за стартиране на приложение и че неизползването им е грешно. Те са много мощни и полезни за много приложения и съм съгласен, че може да реши проблема ми и тук. - person Rizwan Sattar; 17.11.2014

Не знам какъв е вашият точен случай на употреба, но в моето приложение потребителят може да излезе от системата във всеки един момент, независимо от това в кой контролер за изглед се намира в момента. След това трябва да представя екрана за влизане и да дам на потребителя шанс да влезе отново и да върна потребителя обратно там, където е бил, ако влизането е било успешно.

Всичко това означава, че не мога да направя контролера за изглед на влизане в основен и да подредя другите контролери върху него, защото не мога просто да ги извадя всички, ако потребителят излезе от системата.

Мога обаче да запазя VC стека и да го прехвърля към екрана за влизане, след което да го превключа обратно към основния VC стек, когато влизането е успешно.

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var primaryViewController: UIViewController?
    var loginViewController: UIViewController?

    func userLoggedOut() {
        self.window?.rootViewController = loginViewController
    }

    func userLoggedIn() {
        self.window?.rootViewController = primaryViewController
    }

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // other setup code
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        loginViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as? UIViewController
        primaryViewController = self.window?.rootViewController

        if (!currentlyLoggedIn) {
            userLoggedOut()
        }
        return true
    }
person Daniel T.    schedule 08.11.2014