Как трябва да свържа контролери за изглед в xcode storyboard?

Бих искал да свържа верижни контролери за изглед в сценарий на xcode, за да постигна следния ефект:

A -> B -> C -> D -> E -> B -> C -> D -> E -> B -> ...

където горните букви представляват отделни контролери за изглед (сцени в пълен размер). Искам да имам хоризонтален слайд отдясно наляво, докато преминавам между изгледи и не искам или се нуждая състоянието за предишни изгледи да бъде запазено (т.е. без натискане или модално преминаване). Все пак трябва да прехвърля известно състояние между изгледите.

Някакви предложения за това как най-добре да постигнете това или с помощта на редактора на сценария, кода или някаква комбинация от двете?


person philipfc    schedule 22.01.2013    source източник


Отговори (1)


Няколко опции изскачат пред мен:

  1. Най-лесното решение с най-голяма обратна съвместимост с по-стари версии на iOS е да използвате контролер за навигация, да запазите препратка към контролера за преглед B някъде и след това можете в E да имате някои IBAction, които правят:

    [self.navigationController popToViewController:B animated:YES];
    

    В този модел всички стъпки ще бъдат представени в разкадровката, с изключение на тази от E до B, за която бихте използвали горния код в IBAction (или каквото и да е).

  2. Ако можете да се откажете от съвместимостта с iOS 5, можете също да използвате прехода unwind. В този сценарий всички сеги ще бъдат представени в сценария. Но много от нас все още не са готови да се откажат от съвместимостта с iOS 5, така че може би не бихте искали да обмисляте това решение. Но ако искате да използвате отвиване, просто ще дефинирате действие за отвиване в B, като например:

    - (IBAction)backToB:(UIStoryboardSegue *)segue
    {
        // if you need to do any UI update because we got an unwind segue
        // back to this controller, do that here
    }
    

    След като имате това действие за отпускане в B, внезапно ще имате нов тип последователност, наречен backToB (въпреки че бих ви предложил да му дадете по-добро име от това), представен ви в IB, и можете да използвате това, за да преминете от E до B. Очевидно всички други натискащи сесии ще бъдат представени във вашия сториборд, както обикновено.

  3. Ако наистина не искате да използвате навигационен контролер, но не се нуждаете от съвместимост с iOS 4, можете също да постигнете това с контролер за изглед, където имате родителски персонализиран контейнерен контролер, ParentVC и A до E ще бъдат дъщерни контролери. След това можете да имате персонализирани стъпки за преход през последователността от дъщерни контролери.

  4. Един последен вариант може да бъде следният:

    BABCDE

    В този сценарий, подобно на опция 1, вие просто използвате навигационен контролер, когато B се зареди за първи път, той незабавно програмно ще направи следното в viewDidLoad

    [self presentViewController:A animated:NO];
    

    Въпреки че B е основният контролер на изгледа, ще изглежда като A. Когато A е готово, той ще се отхвърли обратно към B, в който момент можете да извършите стандартната си B-C-D-E прогресия на последователно натискане, но тъй като направихме B основния контролер, E може просто да направи popToRootViewControllerAnimated, за да се върне към B, и няма нужда да се притеснявате да държите указател към B наоколо. Този модел има много смисъл, ако A е контролер за влизане или начален екран, или нещо донякъде извън нормалния поток.

От тях 1 вероятно е най-лесният, 2 може да се счита за най-елегантният (въпреки че губите поддръжка за iOS 5 и по-стари версии), 3 е опция, ако нямате нищо против да напишете малко повече (някой сложен) код и използването на паметта е критично , и 4, като 1, е доста лесно, но е само въпрос дали потокът има смисъл за вашето приложение. Лично аз бих предпочел опция 1 или 4, в зависимост от това какъв беше контролерът за изглед A. И ако беше необходима съвместимост с iOS 4, тези две опции биха работили и с NIB.

person Rob    schedule 22.01.2013
comment
Вариант 4 изглежда добре с изключение на навигацията в горната част. Използвайки свойства или код, има ли лесен начин да скриете навигацията, която навигационният контролер въвежда в горната част на всеки следващ изглед? - person philipfc; 23.01.2013
comment
@philipfc В код: [self.navigationController setNavigationBarHidden:YES animated:NO]; в viewDidLoad на B. Може също да искате да отидете на сценария, да щракнете върху навигационния контролер, да отидете на инспектора на атрибутите (четвъртият раздел в най-десния панел), да отидете на Симулирани показатели и да изключите горната лента. Това не замества кода setNavigationBarHidden, а само улеснява проектирането на вашите сцени, ако знаете как ще изглеждат в действителност. И ако направите това на самия навигационен контролер, тази симулирана метрика ще се разпространи през всички сцени. - person Rob; 23.01.2013
comment
Това се съчетава добре. Единствената промяна, която направих по време на тестването, е да махна отметката от Показва лентата за навигация в инспектора на атрибутите на навигационния контролер и това изглежда премахва необходимостта от скриване на лентата за навигация в кода. - person philipfc; 23.01.2013
comment
@philipfc Не знаех за тази опция, но има смисъл. Благодаря! - person Rob; 23.01.2013