0

您如何以编程方式确保 tableView-HeaderView-TextField 的光标处于活动状态(即是第一响应者)?

我的表看起来像这样(即带有自定义 TextField 标题)。到目前为止,光标只能通过在文本字段内单击而进入灰色标题字段。但我希望能够以编程方式将光标移到文本字段中......

在此处输入图像描述

我的自定义 tableview-header 的代码如下所示:

// drawing a custom Header-View with a TextField on top of the tableView
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let container = UIView(frame: CGRectMake(0, 0, self.view.frame.size.width, 50))
    let textField = UITextField(frame: CGRectMake(10, 15, self.view.frame.size.width/2 - 40, 45))
    textField.delegate = self
    self.txtfield = textField
    textField.textColor = UIColor.blackColor()
    let placeholder = NSAttributedString(string: "..add player", attributes: [NSForegroundColorAttributeName: UIColor.darkGrayColor()])
    textField.attributedPlaceholder = placeholder
    textField.backgroundColor = UIColor.lightGrayColor()
    container.addSubview(textField)

    var headPlusBttn:UIButton = UIButton.buttonWithType(UIButtonType.ContactAdd) as! UIButton
    headPlusBttn.center.x = self.view.frame.size.width - 20
    headPlusBttn.center.y = 38
    headPlusBttn.enabled = true
    headPlusBttn.addTarget(self, action: "addTeam:", forControlEvents: UIControlEvents.TouchUpInside)
    container.addSubview(headPlusBttn)

    return container
}

我的第一种方法是像这样设置 headerViewForSection 的第一响应者(参见代码):

// reload entries
func reloadEntries() {
    self.tableView.reloadData()
    // the following does unfortunately not work !!!!!
    self.tableView.headerViewForSection(1)?.becomeFirstResponder()
}

不知道为什么这不起作用。也许,Section-Nr (Int=1) 是错误的。但我尝试了几个部分编号。没有光标在它应该在的地方。

任何帮助表示赞赏!

4

2 回答 2

0

通常在这种情况下添加延迟会有所帮助。它允许操作系统对视图做它想做的一切,然后它不会同时搞乱你想要做的事情。

也许是这样的:

func reloadEntries() {
    self.tableView.reloadData()

    let delay = (Int64(NSEC_PER_SEC) * 0.1)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, triggerTime), dispatch_get_main_queue(), { () -> Void in
        self.tableView.headerViewForSection(1)?.becomeFirstResponder()
    })
}

我没有测试过它来做你想做的事,所以你可能需要找一个不同的地方来放这个。

另外,您确定要影响第 1 节中的视图吗?从您的图像看来,您想弄乱第 0 节中的标题。

请务必进入调试器并检查标头是否为 nil。您的代码暗示这是一个有效条件。您可以尝试这样编写它(至少用于测试):

if let header = self.tableView.headerViewForSection(1) {
    header.becomeFirstResponder()
}
else {
    print("There is no header.")
}
于 2015-05-25T22:07:27.300 回答
0

尝试 self.tableView.headerViewForSection(1)?.textfield.becomeFirstResponder()

于 2015-05-25T22:29:36.250 回答