答案 0 :(得分:33)
请注意,解决方案可能会在将来更新到iOS时崩溃。我'米 访问未记录的私有API。这种解决方案非常脆弱。请参阅以下评论。
UIAlertController *customActionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *firstButton = [UIAlertAction actionWithTitle:@"First Button" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
//click action
}];
[firstButton setValue:[UIColor blackColor] forKey:@"titleTextColor"];
[firstButton setValue:[UIColor blackColor] forKey:@"imageTintColor"];
[firstButton setValue:@true forKey:@"checked"];
UIAlertAction *secondButton = [UIAlertAction actionWithTitle:@"Second Button" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
//click action
}];
[secondButton setValue:[UIColor blackColor] forKey:@"titleTextColor"];
UIAlertAction *cancelButton = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){
//cancel
}];
[cancelButton setValue:[UIColor blackColor] forKey:@"titleTextColor"];
[customActionSheet addAction:firstButton];
[customActionSheet addAction:secondButton];
[customActionSheet addAction:cancelButton];
[self presentViewController:customActionSheet animated:YES completion:nil];
答案 1 :(得分:6)
快速版本:4.1
我通过创建扩展来遇到此实现 UIAlertController。
extension UIAlertController {
static func actionSheetWithItems<A : Equatable>(items : [(title : String, value : A)], currentSelection : A? = nil, action : @escaping (A) -> Void) -> UIAlertController {
let controller = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
for (var title, value) in items {
if let selection = currentSelection, value == selection {
// Note that checkmark and space have a neutral text flow direction so this is correct for RTL
title = "✔︎ " + title
}
controller.addAction(
UIAlertAction(title: title, style: .default) {_ in
action(value)
}
)
}
return controller
}
}
实施:
func openGenderSelectionPopUp() {
let selectedValue = "Men" //update this for selected value
let action = UIAlertController.actionSheetWithItems(items: [("Men","Men"),("Women","Women"),("Both","Both")], currentSelection: selectedValue, action: { (value) in
self.lblGender.text = value
})
action.addAction(UIAlertAction.init(title: ActionSheet.Button.cancel, style: UIAlertActionStyle.cancel, handler: nil))
//Present the controller
self.present(action, animated: true, completion: nil)
}
最终结果:
希望有帮助!
谢谢
答案 2 :(得分:2)
另一种选择是将复选标记字符添加到按钮标题,例如“ Title✓”。它会在标题旁边,而不是在按钮的右侧,但是我认为这不是一个很大的问题。
答案 3 :(得分:0)
尝试这个技巧:
谷歌所有这些项目的教程。正如我所说,这不是一项简单的任务,因为Xcode中没有开箱即用的复选标记功能。
答案 4 :(得分:0)
快速实施:
class Controller: UIViewController {
var isFirstButtonChecked = true
@IBAction func buttonTapped(_ sender: UIButton?) {
let firstButton = UIAlertAction(title: "First Button", style: .default, handler: { [unowned self] _ in
self.isFirstButtonChecked = true
print("First Button tapped")
})
//Here's the main magic; it's called Key-Value Coding, or KVC:
firstButton.setValue(isFirstButtonChecked, forKey: "checked")
let secondButton = UIAlertAction(title: "Second Button", style: .default, handler: { [unowned self] _ in
self.isFirstButtonChecked = false
print("Second Button tapped")
})
secondButton.setValue(!isFirstButtonChecked, forKey: "checked")
let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
alert.addAction(firstButton)
alert.addAction(secondButton)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
}
}
您还可以使用枚举来为更多按钮提供复选标记:
class Controller: UIViewController {
enum ButtonChecked {
case first
case second
case third
case forth
}
var buttonChecked: ButtonChecked = .first
@IBAction func buttonTapped(_ sender: UIButton?) {
let firstButton = UIAlertAction(title: "First Button", style: .default, handler: { [unowned self] _ in
self.buttonChecked = .first
print("First Button tapped")
})
let secondButton = UIAlertAction(title: "Second Button", style: .default, handler: { [unowned self] _ in
self.buttonChecked = .second
print("Second Button tapped")
})
let thirdButton = UIAlertAction(title: "Third Button", style: .default, handler: { [unowned self] _ in
self.buttonChecked = .third
print("Third Button tapped")
})
let forthButton = UIAlertAction(title: "Forth Button", style: .default, handler: { [unowned self] _ in
self.buttonChecked = .forth
print("Forth Button tapped")
})
let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
switch buttonChecked {
case .first:
firstButton.setValue(true, forKey: "checked")
case .second:
secondButton.setValue(true, forKey: "checked")
case .third:
thirdButton.setValue(true, forKey: "checked")
case .forth:
forthButton.setValue(true, forKey: "checked")
}
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
alert.addAction(firstButton)
alert.addAction(secondButton)
alert.addAction(thirdButton)
alert.addAction(forthButton)
alert.addAction(cancel)
self.present(alert, animated: true, completion: nil)
}
}