将button添加到UIPickerView – Swift 1.2

我想在UIPickerView (在它的顶部)添加两个UIButtons 。 请看看这个图片中的CancelDonebutton:

在这里输入图像说明

我该怎么做?

我解决了这个问题,在Swift中回答:

 var pickerView = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 300)) pickerView.backgroundColor = .whiteColor() pickerView.showsSelectionIndicator = true var toolBar = UIToolbar() toolBar.barStyle = UIBarStyle.Default toolBar.translucent = true toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) toolBar.sizeToFit() let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Bordered, target: self, action: "donePicker") let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Bordered, target: self, action: "canclePicker") toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.userInteractionEnabled = true textField.inputView = pickerView textField.inputAccessoryView = toolBar 

这里是我如何在ObjC中添加一个带button的select器popup框到文本框。 应该足够简单,以迅速转化。 基本上你创buildselect器并将其分配给文本inputView 。 然后创build一个工具栏,在popup的时候将其分配给位于inputAccessoryView顶部的文本inputAccessoryView

 self.manufacturerPicker = [[UIPickerView alloc] initWithFrame:CGRectZero]; self.manufacturerPicker.delegate = self; self.manufacturerPicker.dataSource = self; [self.manufacturerPicker setShowsSelectionIndicator:YES]; self.filterByManufacturerTextField.inputView = self.manufacturerPicker; UIToolbar *manufacturerPickerToolbar=[[UIToolbar alloc] init]; manufacturerPickerToolbar.barStyle = UIBarStyleBlack; manufacturerPickerToolbar.translucent = YES; manufacturerPickerToolbar.tintColor = nil; [manufacturerPickerToolbar sizeToFit]; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(manufacturerPickerDoneClicked:)]; UIBarButtonItem *spacerButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(manufacturerPickerCancelClicked:)]; [manufacturerPickerToolbar setItems:@[cancelButton,spacerButton,doneButton]]; self.filterByManufacturerTextField.inputAccessoryView = manufacturerPickerToolbar; 

更新为当你没有UITextField作为起点:

如果你想从一个单元格启动一个select器,就好像它是一个文本字段select器,我相信你必须让你的UITableViewCell实现成为第一个响应者的过程。

要做到这一点,我认为这个过程是在你的单元中实现UIResponder协议。

1)覆盖canBecomeFirstResponder并返回YES。

2)重写inputView属性获取器。 在这个代码中返回你的UIPickerView。

§3)重写inputAccessoryView属性getter。 在这个代码中返回你的UIToolbar。

现在在你的单元格中,当你select单元格时,通过调用[self becomeFirstResponder];使单元格成为第一个响应者[self becomeFirstResponder];

然后,这应该把select器和工具栏正常,我想。 这可能还有更多。

取消或完成时,使用[self resignFirstResponder];

之前没有这样做,但我认为这是一般的过程。

选项2(作弊):

有时作弊更容易。 在你的单元格的后面添加一个隐藏的UITextField,或者添加一个宽度为0的单元格。 根据原始build议设置其inputView和inputAccessoryView。

然后,当你select单元格时,只需使用[self.<your text field property> becomeFirstResponder];将UITextField作为第一个响应者[self.<your text field property> becomeFirstResponder];

这应该通过后门给你相同的结果。

看我的。 我有收集查看和UIPickerselect照片文件夹。

在这里输入图像说明

 //MARK:- SHOW PHOTO FOLDER BUTTON METHOD @IBAction func photoFolderListButtonClicked(sender: UIButton) { self.navigationItem.setHidesBackButton(true, animated: true) //Making PickerView of Competitors let DEVICE_SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width photoFolderListPicker.frame = CGRectMake(0.0, 44.0, DEVICE_SCREEN_WIDTH, 260) photoFolderListPicker.dataSource = self photoFolderListPicker.delegate = self photoFolderListPicker.showsSelectionIndicator = true; photoFolderListPicker.backgroundColor = UIColor.whiteColor() let pickerDateToolbar = UIToolbar(frame: CGRectMake(0, 0, DEVICE_SCREEN_WIDTH, 44)) pickerDateToolbar.barStyle = UIBarStyle.Black pickerDateToolbar.barTintColor = UIColor.blackColor() pickerDateToolbar.translucent = true //Cancel button on photoFolderListPicker let barItems = NSMutableArray() let labelCancel = UILabel() labelCancel.text = " Cancel" let titleCancel = UIBarButtonItem(title: labelCancel.text, style: UIBarButtonItemStyle.Plain, target: self, action: Selector("cancelPickerSelectionButtonClicked:")) titleCancel.tintColor = UIColor.whiteColor() barItems.addObject(titleCancel) var flexSpace: UIBarButtonItem flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil) barItems.addObject(flexSpace) //Done Button on photoFolderListPicker let doneBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: Selector("photoFolderSelectionDone:")) barItems.addObject(doneBtn) doneBtn.tintColor = UIColor.whiteColor() pickerDateToolbar.setItems(barItems as [AnyObject] as? [UIBarButtonItem], animated: true) actionView.addSubview(pickerDateToolbar) actionView.addSubview(photoFolderListPicker) if (window != nil) { window!.addSubview(actionView) } else { self.view.addSubview(actionView) } UIView.animateWithDuration(0.2, animations: { self.actionView.frame = CGRectMake(0, UIScreen.mainScreen().bounds.size.height - 250.0, UIScreen.mainScreen().bounds.size.width, 250) }) } //MARK:- PICKERVIEW DELEGATE METHODS func pickerView(_pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return model.documentFolders.count } func numberOfComponentsInPickerView(_pickerView: UIPickerView) -> Int { return 1 } func pickerView(_pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { return model.documentFolders[row].value } //MARK:- PICKERVIEW BUTTON METHODS func cancelPickerSelectionButtonClicked(sender: UIBarButtonItem) { self.navigationItem.setHidesBackButton(false, animated: true) UIView.animateWithDuration(0.2, animations: { self.actionView.frame = CGRectMake(0, UIScreen.mainScreen().bounds.size.height, UIScreen.mainScreen().bounds.size.width, 210.0) }, completion: { _ in for obj: AnyObject in self.actionView.subviews { if let view = obj as? UIView { view.removeFromSuperview() } } }) photoFolderListButton.setTitle(" "+"Select Folder", forState: UIControlState.Normal) } func photoFolderSelectionDone(sender: UIBarButtonItem) { uploadedPhotoFolderName?.isEmpty loadedFromPageSection = "fromPhotoFolderSelectionDone" self.disableScoutDetailUserInterfaceElementsDutingApiCall() //setting selectedPhotoFolderItem and selectedPhotoFolderItemId let myRow = photoFolderListPicker.selectedRowInComponent(0) selectedPhotoFolderItem = model.documentFolders[myRow].value! selectedPhotoFolderItemId = Int(model.documentFolders[myRow].key!) UIView.animateWithDuration(0.2, animations: { self.actionView.frame = CGRectMake(0, UIScreen.mainScreen().bounds.size.height, UIScreen.mainScreen().bounds.size.width, 260.0) }, completion: { _ in for obj: AnyObject in self.actionView.subviews { if let view = obj as? UIView { view.removeFromSuperview() } } }) photoFolderListButton.setTitle(" "+(selectedPhotoFolderItem as? String)!, forState: UIControlState.Normal) self.view.makeToastActivityWithMessage(message: "Fetching") //Delegate is added to class after popViewControllerAnimated(true) called model.delegate = self //API CALL - Fetching Photos AppController().fetchPropertyPhotosGallery(hbId, propertyId: scoutPropertyId, fileTypeId: selectedPhotoFolderItemId) }