Swift/iOS - 多个Android下拉列表的替代方案是什么?

3

我是iOS和Swift的新手。我已经制作了一款安卓应用程序几年了。现在我正在学习Swift并为iOS设备制作它。

我需要帮助寻找替代下拉列表的方法,因为这是我在安卓中使用的。

我一直在研究UIPickerViews、带有表视图的UIPopovers等等。

问题是,我需要在一个ViewController中有多个下拉列表的替代方案。

这是我安卓应用程序中的视图,我希望我的iOS版本看起来非常相似。enter image description here

1个回答

4
我过去几个月一直在开发调查应用程序,而这个确切的问题已经出现了好几次。虽然`UIPickerView`大多数时候是有意义的,但它不允许用户一次看到超过几个选项,而且从iPhone 4s到6+或iPad上的比例也不太适合。
我建议的第一件事是为您的下拉菜单创建一个按钮。我发现任何看起来像按钮的东西都可以很好地工作,但使其看起来像超链接或与周围环境过于内联并不会从UX角度很好地工作。
这是我使用的按钮的样子: This is just a UIButton with a border on it 所有这些只是一个带有细边框的UIButton,圆角为~5。
至于实际的下拉菜单,我发现弹出窗口通常是非常有效的。对我来说最简单的实现方式是使用`UIAlertController`。(这仅适用于iOS 8+,但如果您正在使用Swift,应该没问题。)使用`UIAlertController`,您可以拥有非常多的选项,一个易于访问的取消按钮,一个标题,一个消息,并以非常标准的方式呈现给用户。您可以在创建控制器时设置每个按钮的操作,因此您根本不需要使用委托,这可以使您的代码更清洁。
这是我的上一个示例的警报控制器的外观。这是iPhone 5s在最小的布局中(横向),但它会自动缩放以适应任何屏幕尺寸,并为用户提供类似的体验。 UIAlertController as a drop down menu 当用户选择答案后,请更新按钮文本以匹配新答案。
除了使用`UIAlertController`之外,我还创建了自己的自定义弹出窗口,其中包含一个表格视图,但我发现自己基本上为了它的外观而重新创建了警报控制器,并发现将其布局调整到每个设备上都刚刚好比它值得的困难得多。话虽如此,`UIAlertController`几乎没有什么东西可以自定义其外观,这可能对某些人来说是个问题。
我觉得我应该补充说明一下为什么我使用UIAlertController而不是UIPickerView,这是有意为之的,因为它允许用户同时看到更多的选项,并利用iPad和更大的iPhone上可用的屏幕大小。此外,选择后的反馈是即时的,因为视图在选择后立即消失,Cancel是一个标准动作,允许用户快速取消选择,并且如果只有几个选项就不需要用户滚动,这意味着只需要一次轻触就可以进行选择。

以下是我用来生成按钮和相应的UIAlertController的代码:

if (self.question.placeholderText) {
    [self.answerButton setTitle:NSLocalizedString(self.question.placeholderText, @"") forState:UIControlStateNormal];
} else {
    [self.answerButton setTitle:NSLocalizedString(@"Please Select One", nil) forState:UIControlStateNormal];
}
[self.answerButton setTitle:[self paddedString:self.answerButton.titleLabel.text] forState:UIControlStateNormal];
self.answerButton.titleLabel.textAlignment = NSTextAlignmentLeft;
self.answerButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
self.answerButton.titleLabel.font = [UIFont appFont];
[self.answerButton setTitleColor:[UIColor appColor] forState:UIControlStateNormal];
[self.answerButton addTarget:self action:@selector(longListLabelTapped) forControlEvents:UIControlEventTouchUpInside];
self.answerButton.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.0001f];
self.answerButton.titleLabel.layer.borderColor = [UIColor appColor].CGColor;
self.answerButton.titleLabel.layer.borderWidth = 1.0f;
self.answerButton.titleLabel.layer.cornerRadius = 5.0f;

- (NSString *)paddedString:(NSString *)input {
    //This adds some space around the button title just to make it look better
    return [NSString stringWithFormat:@"  %@  ", input];
}

为了创建UIAlertController,您需要一个选项数组。
_optionsController = [UIAlertController
                      alertControllerWithTitle:self.question.longListTitle
                      message:nil
                      preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {

}];
[_optionsController addAction:cancelAction];


for (NSString *optionName in self.question.possibleAnswers) {
    UIAlertAction *action = [UIAlertAction actionWithTitle:optionName
                                                     style:UIAlertActionStyleDefault
                                                   handler:^(UIAlertAction *action) {
                                                       // Do something with the selected answer
                                                       [self.answerButton setTitle:[self paddedString:optionName] 
                                                                          forState:UIControlStateNormal];
                                                   }];
    [_optionsController addAction:action];
}

这似乎是一个非常好的做法。我在我的一个类似的应用程序中看到过这种方式,你点击一个看起来像文本字段的东西,但打开了一个AlertController类型的感觉,当选择完成后,它会用该文本填充,选择的名称,在那个文本字段中。非常感谢。看起来这是最好的方法。 - Matthew White
你能发邮件给我一些关于如何实现它的技巧和代码吗?我很喜欢你的东西,需要一些帮助。 - Matthew White
下班后我一定会尝试这一切。看起来非常有前途。 - Matthew White
这个非常好用。谢谢啊。目前为止最佳解决方案。我标记了这个作为答案吗?我不确定我是否做对了。 - Matthew White
我很高兴它能正常工作!回顾这段代码后,我发现有更多的细节没有解释得很清楚,所以我很高兴它对你来说运行良好。感谢您接受了这个答案。 - Fennelouski
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接