web-dev-qa-db-ja.com

Swift-BarButtonItemが押されたときにUIPickerViewをプログラムで作成して表示します

最初に、非表示のUIPickerViewを既存のUISearchBarと一緒にMain.storyboardに追加したかったので、BarButtonItemをクリックすると、UIPickerViewが表示されます。しかし、私は与えられた空間でそれらを同時に両方持つことはできないようです。

代わりに、私の最善の代替策は、プログラムで作成することでした。私は既存のチュートリアル( http://sourcefreeze.com/ios-uipickerview-example-using-Swift/ )と同様の質問( Programmatically Create and Show UIPickerView )に従いました説明が印刷されているため、私はUIPickerViewを持っている(?)ようで、次のようになります。

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

ここに私の助けになるかもしれない私の現在のコードの一部があります:

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

}

BarButtonItemが押されたときにプログラムで作成されたUIPickerViewを表示するのを手伝っていただけませんか?他にご不明な点がございましたら、お問い合わせください。

どうもありがとう。

9
Javz

pickerViewViewControllerのサブビューとして追加することはありません。非表示にしているため、viewDidLoad()で追加できます。次に、それを再表示すると、ビューが表示されます。

編集:追加されたコード

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
}

上記のコードを使用して、ボタンで再表示すると、ビューが表示されます。

6
pbush25