选择/关闭UIPickerView没有按钮的选项时更新TextFields?

时间:2016-02-11 23:00:23

标签: ios swift uitextfield uipickerview

我使用Swift 2在Xcode 7中工作。

我在文本字段中设置了UIPickerViews,它们都可以正常工作。我使用以下方法关闭pickerviews:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    pickerOptions.resignFirstResponder()
    (etc.)
}

我的问题是我有一个选择器视图,我希望它是一个“预设”菜单,它将通过选择一个选择器视图值来更新3个常规文本字段输入和一组值,而无需使用按钮更新值。我不完全确定如何解决这个问题,因为我对代表还不是很熟悉(如果它甚至涉及到它们)。我真的很失落如何更新/刷新ViewController。

我猜它与textFieldDidEndEditing有关(因为我已经通过设置UIPickerView设置了这些类:UIPickerViewDataSourceUIPickerViewDelegateUITextFieldDelegate)任何帮助表示赞赏:)

2 个答案:

答案 0 :(得分:1)

关于代表们的一切。我知道你有一个pickerView应该在用户选择时设置一些textFields的内容。 pickerView是一个库存对象,需要告诉您的班级在不知道您的班级具体情况的情况下发生了什么。它通过说,如果你实现我定义的协议,那么我将调用你的函数让你知道。对于pickerView,相关协议为UIPickerViewDelegate,它公开了一个名为delegate的属性,该属性只能设置为实现协议的对象。如果设置了pickerView的委托,当用户滚动pickerView时,它将调用该对象的pickerView:didSelectRow:inComponent:函数。

您只需要创建一个符合UIPickerViewDelegate协议的对象,并相应地设置pickerView的delegate属性。通常情况下,您只需将此功能添加到viewController,方法如下:

class viewController: UIViewController, UIPickerViewDelegate {
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        // Now you can update the textField(s)
    }
}

请注意,pickerView:didSelectRow:inComponent:的定义标记为可选。这意味着如果您说您实现UIPickerViewDelegate,但没有定义它,编译器将不会让您知道。如果您不小心拼错或者签名错误,这可能会让您感到困惑 - 您会认为它已被定义但它永远不会被调用。

答案 1 :(得分:0)

您可以实现委托方法:

UIPickerViewDelegate

属于option协议。

要在XCode // The function signature needs some changes // 1: string read. 0: out-of-memory EOF:end-of-file // const * int get_string(const char prompt[], char** string) { // Never do this. If prompt contain `'%'`, code becomes a hackers target // printf(prompt); // Prompt the user fputs(prompt, stdout); // Prompt the user fflush(stdout); // use size_t, not int // int index size_t size = 0; // Keep track of size for (;;) { // Use int to distinguish EOF from all other char // char place = getchar(); int place = getchar(); // Note: reallocating every loop is generally inefficient void *former = *string; // sizeof(string) + sizeof(char) // sizeof(string) is the size of the pointer, not the size of memory it points to. // sizeof(char) is always 1 *string = realloc(*string, size + 1); if (*string == NULL) { free(former); // free old buffer return 0; // fail } // add termination on \n or EOF if (place == '\n' || place == EOF) { // Add detection and housekeeping for EOF if (place == EOF && size == 0) { free(*string); *string = NULL; return EOF; } break; } (*string)[size++] = place; } (*string)[size] = `\0`; return 1; // Operation succeeded } 上查看协议文档,请单击协议名称。