我一直试图获得一个下拉选择菜单,但每次都会遇到问题。
计划是选择“选择输入”框(label
,text
或button
),点击一个类似下拉列表的popOver,用户可以从中选择一个项目一个数组作为输入。
此版本包含一个包含2个视图控制器的故事板,主视图只有label
和button
。另一个(Popover)有tableview
,label
显示当前选择和一个确定按钮。
我的工作UIPopOver
(See code)正在传递我想要的值,但是在使用UITextField
进行选择后,我无法停用键盘。
我尝试切换到一个按钮,关闭时button label
更新为所选值,但由于某种原因,在此方法中,我返回的每个值都会导致错误。
我最近的尝试是使用label
旁边有一个修改button
,允许它切换label
,但这会返回一个可选的错误,我不知道理解。
我收到以下错误:
在popOverLocation = editedField.frame
“主题1:EXC_BAD_INSTRUCTION”
我的打印行显示“可选(”测试“)
然后是“致命错误:在展开可选值时意外发现nil。
我之前收到同样的错误,试图设置TestLabel.text = newValue
,我已经确认了我的网点,但我以前从未见过与标签相关的错误。
我是否采取了错误的方式? 我愿意完全废弃这些代码并尝试另一种方式,但我不确定要走哪条路。我的最终项目将包括其中几个需要从数组中选择的选项的字段。
(注意:在我的代码版本中,我已将UITableviewController
以及popover的所有代码与主界面一起移动到单个View Controller中。这是为了测试目的而进行的)
我的守则遵循:
import UIKit
var newValue = ""
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
var arrayofstuff = ["test 1", "test 2", "test 3", "test 4"]
var selection: String = ""
var popOverLocation: CGRect!
@IBOutlet weak var TestLabel: UILabel!
@IBOutlet weak var selectionLabel: UILabel!
@IBOutlet var editedField: UILabel!
@IBOutlet weak var editButton: UIButton!
@IBAction func editButtonAction(sender: AnyObject) {
println(TestLabel.text?)
popOverLocation = editedField.frame
popOver()
}
@IBAction func okButton(sender: AnyObject) {
println(newValue)
TestLabel.text = newValue
self.dismissViewControllerAnimated(false, completion: nil)
}
@IBOutlet var test2: UILabel!
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
{
return arrayofstuff.count
}
func tableView(tableView: UITableView!,
cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
{
let cell:UITableViewCell = UITableViewCell(style:UITableViewCellStyle.Default, reuseIdentifier:"Cell")
cell.textLabel?.text = arrayofstuff[indexPath.row]
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let cell:UITableViewCell = UITableViewCell(style:UITableViewCellStyle.Default, reuseIdentifier:"Cell")
var currentrow = indexPath.row
if currentrow == 0 {
selection = arrayofstuff[0]
selectionLabel.text = selection
newValue = selection
println(newValue)
} else if currentrow == 1{
selection = arrayofstuff[1]
selectionLabel.text = selection
newValue = selection
println(newValue)
} else if currentrow == 2{
selection = arrayofstuff[2]
selectionLabel.text = selection
newValue = selection
println(newValue)
} else if currentrow == 3{
selection = arrayofstuff[3]
selectionLabel.text = selection
newValue = selection
println(newValue)
}
}
//function for creating the popover
func popOver() {
//Read the height, and XY coordinates of the active button
var h = popOverLocation.height
var x = popOverLocation.origin.x
var y = popOverLocation.origin.y + h
//create the popover
var popoverContent = self.storyboard!.instantiateViewControllerWithIdentifier("Popover") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController! as UIPopoverPresentationController
popover.sourceView = self.view
popover.delegate = self
//set the size of the popover
popoverContent.preferredContentSize = CGSizeMake(200,300);
//set the direction the popover arrow is allowed to point
popover.permittedArrowDirections = UIPopoverArrowDirection.Up
//using the buttons coordinates set the location of the popover
popover.sourceRect = CGRectMake(x,y,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}