2015-02-25 2 views

ответ

26

Я решил это, ответ в 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 
+0

Где вы объявили «textLabel»? Является ли это ярлыком, заполненным вашим выбором UIPickerViews? – davidrayowens

+1

TextLabel - это выход UILabel, поэтому, когда вы пытаетесь «отредактировать» ярлык, появится pickerView. –

+0

Я имею в виду UITextField, извините –

2

Вот как я делаю это в ObjC, чтобы добавить всплывающее окно выбора с кнопками в текстовое поле. Должно быть достаточно простым, чтобы быстро перевести. В основном вы создаете сборщик и назначаете его тексту inputView. Затем вы создаете панель инструментов, которую вы назначаете на текст inputAccessoryView, который находится поверх inputView, когда он появляется.

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 в качестве начальной точки:

Если вы хотите запустить сборщик из клетки, как если бы это был сборщик текстового поля, я считаю, вы должны сделать ваш UITableViewCell реализует процесс становления первым ответчиком.

Для этого я считаю, что процесс заключается в реализации протокола UIResponder в вашей камере.

1) переопределить canBecomeFirstResponder и вернуть ДА.

2) переопределение inputView свойство геттер. В этом коде верните свой UIPickerView.

§3) переопределить inputAccessoryView собственность геттер. В этом коде верните UIToolbar.

Теперь, когда вы выбрали ячейку, сделайте ячейку первым ответчиком, позвонив по номеру [self becomeFirstResponder];.

Это должно привести к сборщику и панели инструментов, я думаю. Там может быть больше.

Когда отменить или сделать, поместите его с помощью [self resignFirstResponder];

не сделали этого раньше, но я думаю, что это общий процесс.

Вариант 2 (Чит):

Иногда обман проще. Добавьте скрытый UITextField в конце вашей ячейки или добавьте ширину 0. Установите его inputView и inputAccessoryView в соответствии с первоначальным предложением.

Затем, когда вы выбираете ячейку просто сделать UITextField первый ответчик, используя [self.<your text field property> becomeFirstResponder];

Это должно дать тот же результат, через заднюю дверь.

+0

Я попробовал это, но это не похоже на работу на Swift 1.2:/Это просто не показывает ничего. –

+0

С чего вы запускаете сборщик? UITextView или что-то еще? Также была ошибка в симуляторе (если вы используете только это), который не отображал всплывающие подсказки правильно, если бы у вас была аппаратная клавиатура, установленная на симуляторе. В меню симулятора снимите галочку Hardware -> Keyboard -> Connect Hardware Keyboard и повторите попытку. В противном случае вы можете опубликовать свой код установки? –

+0

Новая проблема: http://stackoverflow.com/questions/28760292/uibarbuttonitem-not-clickable-in-uitoolbar –

1

См Mine. У меня есть Collection View и UIPicker, чтобы выбрать фото Folders.

enter image description here

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

}