我想创建一个可以在代码中多次使用的操作表。要做到这一点,我需要能够根据操作表标题使用函数。有没有办法将函数作为参数数组(如“title”参数)传递?
//MARK: - UIAlert action sheet title
enum ActionSheetLabel: String {
case camera = "Camera"
case photoLibrary = "Album"
case cancel = "Cancel"
}
class CameraHandler {
static let cameraHandler = CameraHandler()
func openCamera() { }
func openPhotoLibrary() { }
}
//MARK: - Alert that shows an action sheet with cancel
extension UIViewController {
func showActionSheetWithCancel(vc: UIViewController, title: [ActionSheetLabel] /*Make a function parameter here to match title*/) {
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
for value in title {
actionSheet.addAction(UIAlertAction(title: value.rawValue, style: .default, handler: {
(alert: UIAlertAction!) -> Void in
//Use the parameter function here to match title
}))
}
actionSheet.addAction(UIAlertAction(title: ActionSheetLabel.cancel.rawValue, style: .cancel, handler: nil))
vc.present(actionSheet, animated: true, completion: nil)
}
}
4条答案
按热度按时间eimct9ow1#
对于UIAlert,您只需要更改preferredStyle .alert它,它就可以为UIAlert工作了,下面的代码只需要复制并粘贴它就可以为UIActionSheet工作了。
检查以下代码以了解用法
如果你有任何疑问,请评论我.谢谢
bybem2ql2#
我已经找出了最好的方法来添加一个行动表与取消和尽可能多的行动所需的。
创建具有类型别名的UIViewController扩展:
然后,在类别中或其他您要使用它的地方,以下列方式加入方法:
pgvzfuti3#
您可以传递闭包并在处理程序中调用它,类似这样的操作应该可以正常工作。
也不知道为什么你要传递
UIViewController
,因为你已经在extension UIViewController
中定义了这个函数,所以我允许我自己删除它,并使用self.present
代替。如您所见,
@escaping () -> ()?
是可选的,因此您也可以传递nil
。col17t5w4#
据我所知,当警报标题更改时,您需要调用特定函数,并且您希望能够从不同的viewController中执行此操作,我希望这会有所帮助
函数的调用将如下所示: