2015-08-14 4 views
10

Ich habe eine UITabBarController mit drei Registerkarten. Wenn eine bestimmte Taste gedrückt wird, möchte ich, dass der Benutzer sofort eine Personenansichtssteuerung (eine Instanz der Klasse ABPersonViewController) sieht.PersonViewController in TabBarController

Ich möchte nicht nur die presentViewController() Methode mit einer Person View-Controller als Parameter verwenden, weil dies zu einer Verzögerung führt, wenn der Benutzer den zugrunde liegenden View-Controller sehen kann, aus dem es präsentiert wird.

Ich kann auch nicht die View-Controller erben von ABPersonViewController, weil es von Apple festgelegt ist, so dass es nicht unterklassifiziert werden kann. Gibt es eine Möglichkeit, dies zu erreichen?

Dank JAL Antwort:

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

Bitte kopieren Sie keine Antwort in Ihre Frage. Wenn eine Antwort Ihnen geholfen hat, können Sie sie aufwerten und akzeptieren. Aber eine Antwort gehört nicht in die Frage. – Rizier123

Antwort

0

Verwenden Sie die UITabBarDelegate Methode 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 

} 

die Tab-Leiste Element auszuwählen (wenn Sie ein Bild verwenden), ändern Sie die UITabBarItemimage oder selectedImage. Da Sie bei Auswahl der Registerkarte false zurückgeben, müssen Sie wahrscheinlich die image-Eigenschaft anstelle der selectedImage ändern.

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

Ein Haltepunkt in der ersten Zeile dieser Methode wird nie erreicht, was darauf hindeutet, dass er nicht tatsächlich aufgerufen wird, wenn ein Registerleistenelement gedrückt und ein neues VC angezeigt wird. – 5813

+0

Haben Sie die Tab-Leiste-Delegat-Eigenschaft auf die Klasse festgelegt, in der Sie diese Methode aufrufen? – JAL

+0

Sprechen wir über 'UITabBarDelegate' oder' UITabBarController' Delegat? Sie sagten 'UITabBarDelegate', aber es erscheint aus der Dokumentation, dass nur' UITabBarControllerDelegate' diese Methode hat? – 5813

0

Antwort

Die wesentliche Idee ist UITabBarController Unterklasse und eine UIButton auf der Tab-Leiste setzen, decken Sie die Original-Tab-Bereich und eine Aktion auf diese Schaltfläche hinzufügen, die relevanten Funktionsaufrufe auslösen .

So dass das Tap-Ereignis tatsächlich nie an die TabBarController, sondern nur an die Schaltfläche übergeben wird. Damit wird der Benutzer niemals den zugrunde liegenden View-Controller sehen.

Beispielcode

Beispiel Swift 1.2 Code, der eine Taste zum Zentrum von 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) 
} 

Referenz hinzufügen:

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

Hinweis

Wenn Sie die Schaltfläche nicht sehen, achten Sie auf den Lebenszyklus von UIViewContoller, da dies möglicherweise die Ursache Ihres Fehlers ist.