Video: Building Dynamic Web Apps with Laravel by Eric Ouyang 2025
Protože byste mohli nahrazovat řadič zobrazení v aplikaci iOS novým - ačkoli jedním ze stejné základní třídy - nový řadič zobrazení má žádný přístup k tlačítku, který potřebuje k zobrazení, popř. Naštěstí lidé z Apple poskytují ideální místo k tomu.
Je-li spuštěna segue - což děláte, když klepnete na položku tabulky - ale předtím, než nový řadič posune svůj pohled na místo, běhový plán scénáře volá metodu aktuálního ovladače zobrazení tak, aby mohl předávat data kontroleru zobrazení, který je které chcete zobrazit.
To znamená, že můžete přenést informace o tlačítku na nový řadič zobrazení ještě předtím, než se dokonce spustí. Pak prepareForSegue: sender:, oba přiřadí tlačítko, které má být použito v ViewDidLoad, a také odmítne řadič zobrazení.
prepareForSegue: odesílatel: je metoda řadiče zobrazení, která oznamuje kontroléru zobrazení, že se chystá provést chybu. segue je objekt UIStoryboadSegue a obsahuje informace o řadičích zobrazení, které se zabývají segeou.
Přestože výchozí implementace této metody nečiní nic, podtřídy UIViewController ji mohou potlačit a předávat data kontroleru zobrazení, který se chystá zobrazit. Segatický objekt má vlastnosti, které ukazují na kontrolér zdrojového zobrazení i na řadič zobrazení. Segue je jediný objekt, který současně ví o řadičích zdrojového i cílového zobrazení.
odesílatel je objekt, který způsobil, že segue, ale nebudete muset použít zde.
Přidáte kód do metody prepareForSegue: sender:, aby DestinationController delegoval UISplitViewController a přiřadil vlastnosti popOverButton a masterPopoverController.
Také můžete popovídat, když se objeví, aby se uživatel nemohl dotknout zobrazení, aby se ho zbavil.
Chcete-li vše udělat, přidejte tento kód do MasterViewController. m.
- (prázdné) prepareForSegue: (UIStoryboardSegue *) segue odesílatel: (id) odesílatel {if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {DetailViewController * currentDetailViewController; pokud je [[self [splitViewController viewControllers lastObject] isKindOfClass: [UINavigationController class]]) currentDetailViewController = (DetailViewController *) ((selfUserViewController.viewControllers lastObject]). topViewController; else currentDetailViewController = [vlastní.splitViewController. viewControllers lastObject]; pokud (aktuálníDetailViewController. masterPopover Controller! = nil) [aktuálníDetailViewController. masterPopover Controller dismissPopoverAnimated: ANO]; DetailViewController * destinationDetailViewController; pokud je [[cílovéViewController je KindOfClass: [UINavigationController class]]) cílDetailViewController = (DetailViewController *) ((UINavigationController *) segue (cílViewController)). topViewController; jiný cílDetailViewController = segue. destinationViewController; já. splitViewController. delegate = destinationDetailViewCon troller; destinationDetailViewController. popOverButton = currentDetailViewController. popOverButton; destinationDetailViewController. masterPopoverController = currentDetailViewController. masterPopoverController;}}
Začnete tím, že najdete aktuální kontrolér detailního zobrazení, protože má tlačítko a vlastnosti, které nový kontrolér potřebuje.
Tento kód se zdá být komplikovanější než je. Nejprve zkontrolujte, zda běžíte na iPadu. Pokud ano, získáte aktuální kontrolér detailního zobrazení tím, že přistupujete k seznamu řadičů pohledu v poli viewController v systému splitViewController. Naštěstí třída UIViewController má vlastnost splitViewController, která vám to usnadní.
Poté zkontrolujte, zda je navigační radič umístěn v poli viewControllers a pokud tam máte, získáte topViewController navigačního ovladače (aktuální kontrolér zobrazení); Pokud tomu tak není, jednoduše použijete řadič v poli. (Uvidíte spoustu odlévání, které se děje tady)
pokud ([[self [splitViewController viewControllers & lastObject]jeKindOfClass: [UINavigationController & # x2028; AktuálníDetailViewController = (RTDetailViewController *)
(UINavigationController *)
[vlastní. splitViewController. viewControllers
lastObject]). topViewController; else
currentDetailViewController = & # x2028; [já. splitViewController. viewControllers
lastObject];
Dále, pokud uvidíte vyskakovací okno, chcete jej odmítnout. Zkontrolujete, jestli se jedná o prvotní řadič (proto jste museli zpřístupnit vlastnost přesunutím do souboru záhlaví.)
pokud (currentDetailViewController.masterPopoverController
! = Nil)[currentDetailViewController. MasterPopoverController > dismissPopoverAnimated: YES];
Nyní najdete nový cílový řadič (ten, který je převeden na) pomocí logiky podobné logice, kterou jste použili k nalezení aktuálního editoru Detail View
pokud ([segue targetViewController < (999)> iskindOfClass: [UINavigationController
class]]) DestinationDetailViewController =
(DetailViewController *) (UINavigationController *)Potom jednoduše nastavte delegáta Správa zobrazení rozděleného na nový kontrolér zobrazení, takže dostane splitViewController: willHideViewController: withBarButtonItem: forPopoverController: an d splitViewController: willShowViewController: invalidatingBarButtonItem: zprávy.
vlastní. splitViewController. delegate = cílDetailViewController;
Nakonec přiřadíte vlastnosti popOverButton a masterPopOverController v novém řadiči zobrazení.
cílDetailViewController. popOverButton =
aktuálníDetailViewController. popOverButton;
cílDetailViewController. masterPopoverController =
AktuálníDetailViewController. masterPopoverController;
Je pravda, že to právě odmítá vyskakování a přidělí vlastnosti, ale nic nezobrazuje, aby se zobrazilo tlačítko. To se skutečně provádí v pohleduDidLoad.
Také můžete zadat velikost vyskakovacího okna přiřazením hodnoty vlastnosti prefferedContentSize. Měli byste si být vědomi toho, že skutečná velikost může být snížena tak, aby se popover hodil na obrazovku a aby se popover nepokrýval klávesnici při prezentaci klávesnice. Můžete vidět kód, který to dělá v metodě MasterViewController awakeFromNib.- (prázdný) awakeFromNib {if ([[UIDevice currentDevice]
userInterfaceIdiom] ==UIUserInterfaceIdiomPad)
& # x2028; {já. clearsSelectionOnViewWillAppear = NE;
vlastní. PreferredContentSize = CGSizeMake
(320.0, 600.0);} [super awakeFromNib];}
Zpráva awakeFromNib je odeslána na objekt, který byl instancován ze scénáře storyboard po načtení a inicializaci všech objektů. Po odeslání zprávy byly nastaveny všechny její výstupní a akční připojení.Pokud se rozhodnete tuto radu ignorovat a neodpustíte ovladač, pak klepnutí mimo okna popupu způsobí odvolání. Můžete ovšem umožnit uživateli interakci s určenými pohledy a nepopírat popover pomocí vlastnosti passthroughViews (i když to zde nebudete dělat). Pak byste musel odmítnout sami sebe.
