我使用Swift 2在Xcode 7中工作。
我在文本字段中设置了UIPickerViews,它们都可以正常工作。我使用以下方法关闭pickerviews:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
pickerOptions.resignFirstResponder()
(etc.)
}
我的问题是我有一个选择器视图,我希望它是一个“预设”菜单,它将通过选择一个选择器视图值来更新3个常规文本字段输入和一组值,而无需使用按钮更新值。我不完全确定如何解决这个问题,因为我对代表还不是很熟悉(如果它甚至涉及到它们)。我真的很失落如何更新/刷新ViewController。
我猜它与textFieldDidEndEditing
有关(因为我已经通过设置UIPickerView设置了这些类:UIPickerViewDataSource
,UIPickerViewDelegate
,UITextFieldDelegate
)任何帮助表示赞赏:)
答案 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
}
上查看协议文档,请单击协议名称。