无法在iOS

时间:2015-05-11 05:46:56

标签: ios uitableview swift optional uipopover

我一直试图获得一个下拉选择菜单,但每次都会遇到问题。

计划是选择“选择输入”框(labeltextbutton),点击一个类似下拉列表的popOver,用户可以从中选择一个项目一个数组作为输入。 此版本包含一个包含2个视图控制器的故事板,主视图只有labelbutton。另一个(Popover)有tableviewlabel显示当前选择和一个确定按钮。

我的工作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.
}


}

0 个答案:

没有答案