2015-10-08 7 views
6

Ursprünglich wollte ich eine versteckte UIPickerView auf der Main.storyboard neben meiner vorhandenen UISearchBar hinzufügen und wenn ein BarButtonItem angeklickt wird, sollte die UIPickerView angezeigt werden; aber es scheint, ich kann sie nicht beide auf einmal in einem gegebenen Raum haben.Swift - UIPickerView programmgesteuert erstellen und anzeigen, wenn BarButtonItem gedrückt wird

Also, stattdessen war meine beste Alternative, es programmgesteuert zu erstellen. Ich habe vorhandenen Tutorials gefolgt (http://sourcefreeze.com/ios-uipickerview-example-using-swift/) und ähnliche Fragen (Programmatically Create and Show UIPickerView) und scheint, wie ich habe eine UIPickerView als die Beschreibung davon gedruckt wird, und ich bekomme die folgende (?):

<UIPickerView: 0x7f86425b1fb0; frame = (100 100; 100 162); layer = <CALayer: 0x7f8642543a20>> 

Hier ist ein Teil meiner aktuellen Code, der von Hilfe sein kann:

AnimalTableViewController.swift

import UIKit 

class AnimalTableViewController: UITableViewController, UINavigationControllerDelegate, UISearchBarDelegate, UISearchDisplayDelegate, UISearchResultsUpdating, UIPickerViewDelegate, UIPickerViewDataSource { 

    @IBOutlet var segmentedSortOption: UISegmentedControl! 
    var array : NSArray = Animal.animalStruct.jsonResult["animal"] as NSArray 
    var filteredArray = [[String:AnyObject]]() 
    var timer = NSTimer() 
    var counter:Int = 1 
    var typePickerView: UIPickerView = UIPickerView() 

    @IBOutlet var typeBarButton: UIBarButtonItem! 
    var resultSearchController = UISearchController() 

    var indexArray:String! 

    @IBAction func refresh(sender: AnyObject) { 

     self.tableView.reloadData() 
     println("refreshed") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.typePickerView.hidden = true 
     self.typePickerView.dataSource = self 
     self.typePickerView.delegate = self 
     self.typePickerView.frame = CGRectMake(100, 100, 100, 162) 
     self.typePickerView.backgroundColor = UIColor.blackColor() 
     self.typePickerView.layer.borderColor = UIColor.whiteColor().CGColor 
     self.typePickerView.layer.borderWidth = 1   
     timer = NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("result"), userInfo: nil, repeats: true) 

     self.resultSearchController = ({ 
      let controller = UISearchController(searchResultsController: nil) 
      controller.searchResultsUpdater = self 
      controller.dimsBackgroundDuringPresentation = false 
      controller.searchBar.sizeToFit() 

      self.tableView.tableHeaderView = controller.searchBar 

      return controller 
     })() 
    } 

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return array.count 
    } 

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { 
     return array[row]["type1"] as String 
    } 

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     typeBarButton.title = array[row]["type1"] as? String 
     typePickerView.hidden = false 
    } 

    func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat { 
     return 36.0 
    } 

    func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { 
     return 36.0 
    } 

    @IBAction func typePickerViewSelected(sender: AnyObject) { 
     typePickerView.hidden = false 
     println(typePickerView.description) 
    } 

} 

Bitte könnten Sie mir helfen, die programmatisch erstellt UIPI anzuzeigen ckerView, wenn das BarButtonItem gedrückt wird? Wenn Sie weitere Fragen haben, fragen Sie bitte.

Vielen Dank.

Antwort

5

Sie fügen nie die pickerView als Unteransicht der ViewController, die Sie in viewDidLoad() tun können, da Sie es verstecken. Dann, wenn Sie es einhüllen, sollte Ihre Ansicht da sein.

EDIT: Added-Code

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.typePickerView.hidden = true 
    //other pickerView code like dataSource and delegate 
    self.view.addSubview(pickerView) //will add the subview to the view hierarchy 
} 

Mit dem obigen Code, jetzt, wenn Sie es auf Knopfdruck sichtbar machen wird die Ansicht angezeigt.

+0

Können Sie mir bitte ein Beispiel zeigen? Da bin ich mir nicht ganz sicher, was du damit meinst. Möchten Sie, dass ich es zum ViewController hinzufüge? Obwohl es auf dem TableViewController deklariert ist. Danke – Javz

+0

@Javz Ich habe meine Antwort mit Code aktualisiert, um Sie zu zeigen. – pbush25

+0

Ich kann es nicht glauben, dass ich etwas so einfach verpasst habe ..... Vielen Dank !! – Javz