2014-09-15 8 views

risposta

1

Ho questo problema esattamente lo stesso.

Ecco come lo risolverò, aggiornerò i miei risultati.

Il UIBarButtonItem restituito da displayModeButtonItem è gestito da UISplitViewController nel proprio tempo utile. Quindi tutte le modifiche che apporti sono bloccate.

Tuttavia, v'è una nuova funzione di delegato:

- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc 

Ho intenzione di creare il mio UIBarButtonItem che cambierà in base a quando questa funzione incendi.

Verrà quindi attivato per attivare la modalità di visualizzazione appropriata.

14

ho risolto per me in questo modo:

UIBarButtonItem(image: UIImage(named:"home"), 
      landscapeImagePhone: UIImage(named:"home"), 
      style: UIBarButtonItemStyle.Plain, 
      target: splitViewController.displayModeButtonItem().target, 
      action: splitViewController.displayModeButtonItem().action) 

Io uso questo AppDelegate invece di splitViewController.displayModeButtonItem() e funziona bene per me.

+0

si assegna il barButtonItem inizializzato a cui navigationItem? – frank

+0

Questa risposta dovrebbe essere accettata come risposta corretta dal proprietario della domanda. – Natarajan

5

Ho realizzato una combinazione di soluzioni josh e voluntas88 sulla mia soluzione.

In primo luogo è necessario utilizzare il metodo UISplitViewControllerDelegate func targetDisplayModeForActionInSplitViewController(_ svc: UISplitViewController) -> UISplitViewControllerDisplayMode e quindi aggiungere un UIBarButtonItem personalizzato. Qui è la mia soluzione:

func targetDisplayModeForActionInSplitViewController(svc: UISplitViewController) -> UISplitViewControllerDisplayMode { 
     if svc.displayMode == UISplitViewControllerDisplayMode.PrimaryHidden || svc.displayMode == UISplitViewControllerDisplayMode.PrimaryOverlay { 
      self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named:"menu.png"), 
       landscapeImagePhone: UIImage(named:"menu.png"), 
       style: UIBarButtonItemStyle.Plain, 
       target: self.splitViewController!.displayModeButtonItem().target, 
       action: self.splitViewController!.displayModeButtonItem().action) 
     }else { 
// disable button on landscape 
      if UIApplication.sharedApplication().statusBarOrientation == UIInterfaceOrientation.LandscapeLeft || UIApplication.sharedApplication().statusBarOrientation == UIInterfaceOrientation.LandscapeRight { 
       self.navigationItem.leftBarButtonItem?.enabled = false 
      } 
     } 
     return UISplitViewControllerDisplayMode.Automatic 
    } 
+0

Perché non utilizzare il parametro di funzione 'svc' invece di forzare lo scostamento della proprietà del membro' splitViewController'? A parte questo, questo sembra carino. Lo proverò. –

0

Quindi ero alla ricerca di un modo per implementare un pulsante personalizzato sul mio UISplitViewController, il pulsante che mostra il RootViewController (il cassetto laterale o sovrapposizione, qualunque sia la sua chiamata). Sono arrivato a questa pagina e la domanda è di cambiare il pulsante che viene inviato da UISplitViewControllerDelegate. Sembra che non ci sia una chiamata che puoi implementare in quel delegato ma puoi semplicemente impostare il pulsante come voce del pulsante barra personalizzata

Sul ViewViewController, la vista non sovrapposta, sovrapposizione, devi solo dichiararla e puntare l'azione e la destinazione del pulsante personalizzato per essere lo stesso di quello che il pulsante del UISplitViewController è

self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self.splitViewController!.displayModeButtonItem().target, action: self.splitViewController!.displayModeButtonItem().action) 
3

farlo nel targetDisplay fa il trucco, ma la rimozione/aggiunta del pulsante è visibile alla fine della rotazione, è meglio farlo in splitViewController: willChangeToDisplayMode: displayMode ma tieni presente che questo dovrebbe essere gestito anche su viewDidLoad anche perché quel metodo delegato non viene chiamato all'avvio.

- (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode 
    { 
     if (displayMode == UISplitViewControllerDisplayModePrimaryHidden || displayMode == UISplitViewControllerDisplayModePrimaryOverlay) { 
      self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Lista" style:UIBarButtonItemStylePlain target:self.splitViewController.displayModeButtonItem.target action:self.splitViewController.displayModeButtonItem.action]; 
     } else { 
      self.navigationItem.leftBarButtonItem = nil; 
     } 
    } 
0

Il problema con tutte le soluzioni di cui sopra è che l'immagine pulsante Indietro non è visualizzato, almeno non nel mio progetto in cui ho cercato di creare la mia propria voce pulsante della barra personalizzata. Quando si utilizza UISplitViewController displayModeButtonItem e si imposta la voce del pulsante della barra sinistra del controller della vista master per integrare la voce del pulsante Indietro (controller.navigationItem.leftItemsSupplementBackButton = YES), il simbolo viene visualizzato prima del titolo della voce del pulsante della barra sinistra. Con uno personalizzato, non è così.

0

Ho provato la soluzione di EmilDo, ma il pulsante di navigazione non è stato mostrato. Ho cambiato la soluzione un po 'e ottenuto che funziona con il seguente codice:

DetailViewController:

override func viewDidLayoutSubviews() { 
    if splitViewController!.displayMode == UISplitViewControllerDisplayMode.PrimaryHidden || splitViewController!.displayMode == UISplitViewControllerDisplayMode.PrimaryOverlay { 
     let displayModeButton = splitViewController!.displayModeButtonItem() 
     let searchButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: displayModeButton.target, action: displayModeButton.action) 
     navigationItem.leftBarButtonItem = searchButton 
    } else { 
     navigationItem.leftBarButtonItem = nil 
    } 
} 

SplitViewController:

func splitViewController(svc: UISplitViewController, willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode) { 
    svc.view.setNeedsLayout() 
} 
1

Questo testo è impostato impostando il pulsante "Indietro" del testo proprietà dell'elemento di navigazione nel Master View Controller tramite Interface Builder Visual guide

+0

Siamo spiacenti, questo approccio non funziona in Xcode 9.2/iOS 11/Swift 4 – BlueskyMed

1

Ho voluto aggiornarlo con la soluzione corretta per mostrare un titolo in displayModeButtonItem. Questo metodo mostra la freccia indietro e il testo corretto. La maggior parte delle soluzioni di cui sopra non include la freccia posteriore alla fine, da quello che potrei dire. Ho provato a impostarlo in modi diversi, ma è sempre stato cancellato quando la vista principale si apriva e si chiudeva di nuovo (iPad Portrait), lasciandomi solo con la freccia indietro.

È necessario impostare la proprietà "Titolo" sul controller di navigazione della Vista master.

Si noti che questo è diverso dall'impostazione dei testi Back e Title sull'elemento di navigazione della vista principale. L'impostazione sull'elemento di navigazione NON FUNZIONERÀ.

select the navigation controller for the master view, then set the "Title Property in the Attributes Inspector"

Problemi correlati