2015-10-08 18 views
6

Początkowo chciałem dodać ukryty UIPickerView na Main.storyboard obok mojego istniejącego UISearchBar i po kliknięciu BarButtonItem, powinien wyświetlić się UIPickerView; ale wydaje się, że nie mogę mieć ich obu naraz na danej przestrzeni.Swift - programowo tworzyć i wyświetlać UIPickerView po naciśnięciu BarButtonItem

Zamiast tego moją najlepszą alternatywą było stworzenie go programowo. I już po istniejących tutoriali (http://sourcefreeze.com/ios-uipickerview-example-using-swift/) i podobne pytania (Programmatically Create and Show UIPickerView) i wydaje się, że ja mam UIPickerView jako opis jest ona drukowana i uzyskać następujące (?):

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

Oto część mojego aktualnego kodu, które mogą być pomocne:

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) 
    } 

} 

proszę mógłbyś mi pomóc wyświetlić programowo stworzony UIPI ckerView po naciśnięciu BarButtonItem? Jeśli masz więcej pytań, proszę zapytaj.

Wielkie dzięki.

Odpowiedz

5

Nigdy nie dodajesz pickerView jako wydziału z ViewController, co możesz zrobić w viewDidLoad(), ponieważ to ukrywasz. Potem, kiedy to odkryjesz, twój widok powinien tam być.

EDIT: Dodano kod

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 
} 

Z powyższym kodem, teraz gdy go odkryć, na naciśnięciu przycisku widok pokaże się.

+0

Czy możesz pokazać mi przykład? Ponieważ nie jestem całkowicie pewien, co przez to rozumiesz. Czy chcesz, abym dodał go do ViewController? Chociaż jest deklarowany w TableViewController. Dzięki – Javz

+0

@Javz Zaktualizowałem swoją odpowiedź kodem, aby Ci pokazać. – pbush25

+0

Nie mogę uwierzyć, że przegapiłem coś tak prostego ..... Wielkie dzięki! – Javz