Как правилно да използвате контролера за модален изглед с сценария на xcode 4.2

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

Начинът, по който обикновено бих поставил контролер за изглед модално, би бил следният: да кажем, че имаме ViewControllerA (A за кратко) и ViewControllerB (B за кратко). Тогава обикновено бих поставил протокол в B.h, указващ метода на делегиране, когато B иска да бъде отхвърлен, и добавям полето id<theProtocol> delegate като свойство assign. Ако приемем, че съм зает с A и искам да представя B модално, бих написал:

B* b = [[B alloc] initWithNibName:@"B" bundle:nil];
b.delegate = self;
[self presentModalViewController:B animated:YES];

Използвайки разкадровката, знам, че е възможно да поставите различен контролер за изглед по модален начин чрез плъзгане с ctrl от бутон към контролер за изглед и избиране на модален като тип преход. Просто се чудя обаче; къде да задам делегата на новия контролер за изглед? Каква е правилната практика за предаване на неща на вашия контролер за модален изглед? Наистина не знам каква е цялата сделка със Segues...


person Warkst    schedule 24.11.2011    source източник


Отговори (2)


Разгледайте това урок

Според него трябва да зададете делегата, както следва:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"AddPlayer"])
    {
        UINavigationController *navigationController = 
          segue.destinationViewController;
        PlayerDetailsViewController 
          *playerDetailsViewController = 
            [[navigationController viewControllers] 
              objectAtIndex:0];
        playerDetailsViewController.delegate = self;
    }
}

Където @"AddPlayer" е името на вашия "модален" сег

person d.lebedev    schedule 24.11.2011
comment
Разгледах урока и очевидно нямам полза да се съмнявам в отговора ви, но не бихте ли се съгласили, че това е много по-грозен код от предишния? Просто изглежда като главоболие да правиш нещо, което беше наистина лесно преди... - person Warkst; 24.11.2011
comment
Не използвайте сторибордове, ако изглежда грозно за вас - person d.lebedev; 24.11.2011
comment
Това е основната причина да не ги използвам сега, просто се страхувам, че ще станат основният начин да го правя в бъдеще. - person Warkst; 24.11.2011
comment
@d.lebedev Мисля, че Storyboards имат много предимства, но и някои недостатъци, може да искате да разгледате отговора ми: stackoverflow.com/questions/8495179/ - person Besi; 20.12.2011

Вместо да използвате контролера за навигация, можете директно да използвате обекта UIStoryboardSegue, предаден в prepareForSegue. Той има свойство, наречено destinationViewController, което е контролерът на изгледа, който се инстанцира. Намирам това за много по-чисто. Това е пример.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"AddPlayer"])
    {
        PlayerDetailsViewController 
          *playerDetailsViewController = 
            (PlayerDetailsViewController *) segue.destinationViewController;

        playerDetailsViewController.delegate = self;
    }
}

IMO Мисля, че сторибордовете са страхотни, защото функционират като план на вашето приложение. Също така никога не съм харесвал писци. =D

person Jai Srivastav    schedule 03.05.2012
comment
О, чакай. Предишният отговор направи това, но те присвоиха контролера за изглед на местоназначение на контролер за изглед на навигация, което не е нужно да правите (дори не знам дали това работи...). - person Jai Srivastav; 03.05.2012