2015-03-21 5 views
2

Я гугл в течение нескольких часов и попробовал несколько учебников, но не смог получить эту работу:Swift - pop up view, date picker?

У меня есть TableView, и я хочу сделать так, нажав на ячейке представляет всплывающее окно у которого есть выбор даты.

У меня есть свой пользовательский диспетчер представлений с презентацией даты (выскакивая снизу), но он занимает весь экран. Мысли? Я нашел одно упоминание об этой точной проблеме во время поиска в Интернете, но решение не сработало.

+0

Вы имеете в виду занимает всю ширину экрана? Сборщики делают это. Вы можете немного изменить ширину, но немного. Вы можете просто подумать о скольжении/сеге на другом экране, хотя руководство по интерфейсу пользовательского интерфейса препятствует переходу на новый экран, чтобы ответить на выбор даты, но они в конце концов оставляют это до разработчика. Вы также можете рассмотреть ввод данных на основе текста. Даже текстовое поле, которое имеет все виды проверок проверки, но это не легко интернационализируется. Если вы имеете в виду, что он занимает все вертикальное пространство, вам нужно ограничить и/или устранить ограничения в представлении выбора. – clearlight

+0

Извините - я имею ввиду, что снизу открывается снизу, но она занимает всю высоту экрана (а также ширину, но я хочу, чтобы она была шириной экрана). – Max

+0

Вы используете автозапуск? Это программно создано или через Interface Builder? Вы добавили вертикальные ограничения? Вы знакомы с автозапуском и созданием ограничений? Если нет, вам действительно нужно это изучить. Не только для того, чтобы вы могли вырвать волосы, а потому, что это очень умный механизм, который очень хорошо работает, когда вы привыкаете к нему. – clearlight

ответ

0

В качестве альтернативы, положите его в UIAlertView(). По крайней мере, он будет сосредоточен. Сочетание стола и сборщика на маленьком экране будет сложным, например, скажем, 4S.

+0

Я рассмотрел это ... дело в том, как он работает прямо сейчас, если бы я мог просто получить представление, чтобы выскочить на достаточную высоту, чтобы показать содержимое этого представления, тогда это будет работать нормально. Прикрепленный фотошоп, чтобы показать, что я имею в виду ... http://imgur.com/Xb2Renm – Max

+0

Это из-за того, как вы хотите, чтобы это было правильно? – clearlight

+0

Да, точно. Размер ширины экрана, высота которого достаточно, чтобы показать содержимое представления. – Max

1

Одна из возможностей состоит в том, чтобы наложить надзору (объект UIView) (с помощью кнопки выбора даты и сделанной кнопки) поверх вашей таблицы. Затем используйте скрытую функцию subview, чтобы скрыть/показать представление. Ниже приведен пример диспетчера tableview. При настройке раскадровки убедитесь, что подвью имеет ограничения компоновки, поэтому выбор даты правильно установлен. Я использовал «разрешение авто макет вопросов», и он работал хорошо. Если вы не выполняете специальную обработку, subview будет располагаться в нижней части строк. Если у вас много строк, aubview будет полностью обрезан или скрыт. Поэтому лучше расположить subview по отношению к нижней части страницы в вашем макете авто.

Вот простой пример, который хорошо сработал для меня. В viewDidLoad скрыто скрыто. Когда вы нажмете на любую строку, вы увидите подвью и дату. Когда вы нажмете кнопку, это снова скроет subview.

import UIKit 

класс TableViewController: UITableViewController {

@IBAction func doneButton(sender: UIButton) { 
    // process the date using datePickerOutlet properties 
    subView.hidden = true // hide the subview and its components 
} 
@IBOutlet weak var subView: UIView! 
@IBOutlet weak var datePickerOutlet: UIDatePicker! 
@IBAction func datePicker(sender: UIDatePicker) { 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    subView.hidden = true // hide the subview and its components 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 3 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    print("\(indexPath.row)") 
    subView.hidden = false // show the subview and its components 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell 
    cell.textLabel!.text = "\(indexPath.row)" 
    return cell 
} 

}

0

Я думаю, что это должно работать:

override var preferredContentSize: CGSize { 
    get{ 
     // Checks if it is currently presenting 
     if presentingViewController != nil { 
      return (datePicker.sizeThatFits(presentingViewController!.view.bounds.size)) 
     } 
     return super.preferredContentSize 
    } 
    set{ super.preferredContentSize = newValue } 
} 

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

Понял из учебника ITunes U Пола Хегарти