2015-08-14 23 views
10

Ho un UITabBarController con tre schede. Quando viene premuto un determinato numero, desidero che l'utente visualizzi immediatamente un controller di visualizzazione persona (un'istanza della classe ABPersonViewController).PersonViewController in TabBarController

Non voglio utilizzare solo il metodo presentViewController() con un controller di visualizzazione persona come parametro perché questo comporta un ritardo, quando l'utente può vedere il controller di visualizzazione sottostante da cui viene presentato.

Non riesco nemmeno a ereditare il controller di visualizzazione da ABPersonViewController, perché è impostato da Apple in modo che non possa essere sottoclassato. C'è un modo per farlo?

Grazie alla risposta di JAL:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 

    let navViewController = viewController as! UINavigationController 

    // First, check to see if the view controller is the one you want to override 
    if let myViewController = navViewController.viewControllers[0] as? ThirdViewController { 

     let abpvc = ABPersonViewController() 
     abpvc.personViewDelegate = self 
     self.navigationController?.pushViewController(abpvc, animated: true) 
     return false 

    } 

    return true 
} 
+1

Si prega di non copiare/includere una risposta nella tua domanda. Se una risposta ti ha aiutato puoi andare avanti e indietro o accettarlo. Ma una risposta non appartiene alla domanda. – Rizier123

risposta

0

Utilizzare il UITabBarDelegate metodo shouldSelectViewController:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 

    // First, check to see if the view controller is the one you want to override 
    if let myViewController = viewController as? ViewControllerToOverride { 
     // do something here, present a new view controller, etc. 
     return false // then return false to prevent the tab from switching 

} 

per selezionare la voce scheda bar (se si sta utilizzando un'immagine), modificare il UITabBarItemimage o selectedImage. Poiché stai restituendo false quando selezioni la scheda, sarà probabilmente necessario modificare la proprietà image anziché selectedImage.

self.tabBar.items?.first?.image = UIImage(...) 
+0

Un punto di interruzione nella prima riga di questo metodo non viene mai raggiunto, suggerendo che non viene effettivamente chiamato quando viene premuto un elemento della barra delle schede e viene presentato un nuovo vc. – 5813

+0

La proprietà del delegato della barra delle schede è stata impostata sulla classe in cui viene chiamato tale metodo? – JAL

+0

Stiamo parlando di 'UITabBarDelegate' o' UITabBarController' delegate? Hai detto 'UITabBarDelegate', ma dalla documentazione risulta che solo' UITabBarControllerDelegate' ha quel metodo? – 5813

0

risposta

L'idea fondamentale è quella di creare una sottoclasse UITabBarController e mettere un UIButton sulla barra delle schede, coprire la zona scheda originale e aggiungere un'azione a tale pulsante, che attiverà le chiamate alle funzioni rilevanti .

In modo che l'evento di tocco non venga mai passato al tabBarController, ma solo al pulsante. In modo che l'utente non "vedrà mai il controller della vista sottostante".

codice di esempio

Esempio 1.2 codice Swift che aggiungere un pulsante al centro di UITabBarController

func AddSampleButton(){ 
    let SampleButton = UIButton() 
    SampleButton.setTranslatesAutoresizingMaskIntoConstraints(false) 
    SampleButton.setBackgroundImage(addImage, forState: UIControlState.Normal) 

    SampleButton.addConstraint(NSLayoutConstraint(item: addButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.view.frame.size.width/5)) 

    SampleButton.addConstraint(NSLayoutConstraint(item: addButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 50)) 

    self.view.addSubview(addButton) 

    self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: addButton, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)) 

    self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: addButton, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0)) 

    SampleButton.enabled = true 
    SampleButton.addTarget(self, action: "SampleAction", forControlEvents: UIControlEvents.TouchUpInside) 
} 

func SampleAction() { 
    let abpvc = ABPersonViewController() 
    abpvc.personViewDelegate = self 
    self.navigationController?.pushViewController(abpvc, animated: true) 
} 

Riferimento:

http://idevrecipes.com/2010/12/16/raised-center-tab-bar-button/

Avviso

Se non si vede il pulsante, prestare attenzione al ciclo di vita di UIViewContoller, che potrebbe essere all'origine del proprio errore.