我想阻止UIAlertController
解雇。
我有一个UIAlertAction
只是简单地将一个字符串附加到UIAlertTextField中,但是,一旦点击它就会解除视图控制器[不需要的]。我已经尝试添加一个不良结果的NSNotification。
UIAlertAction *pasteMessage = [UIAlertAction actionWithTitle:@"Paste Message" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
UITextField *textField = alertC.textFields.firstObject;
textField.text = [textField.text stringByAppendingString:[NSString stringWithFormat:@"%@", copiedString]];
}];
我也尝试过将pasteMessage设置为:
[alertC canPerformAction:@selector(dismissViewControllerAnimated:completion:) withSender:pasteMessage];
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
UIAlertController *alertController = (UIAlertController *)self.presentedViewController;
UIAlertAction *paste = alertController.actions.firstObject;
if (paste) {
flag = NO;
} else {
flag = YES;
}
}
编辑,我不打算阻止点击UIAlertAction
我希望阻止UIAlertController
在点击所述操作时解雇。无论如何都可以启用/禁用该操作,但我的目标是通过按下操作将复制的消息粘贴到UITextField
中(因此我不希望将其解除)
我也意识到将BOOL设置为dismissViewControllerAnimated:
只是将其设置为而不是动画视图控制器解雇,我不希望它暗示它是为了停止实际的解雇过程。简单地提供我尝试过与我的目标相关的事情。我选择使用复制的消息自动填充 new UIAlertController
textField时,我还尝试使用新 UIAlertControllers
,但它可以正常工作,但是对于可以做的事情,我觉得这太糟糕了。
答案 0 :(得分:26)
修改强>
针对Swift 3进行了更新
所以我真的让这个工作了。简而言之,它涉及在解雇发生之前触发的UIAlertController
添加手势识别器。
首先,为您的UIAlertController
和UIAlertAction
创建延迟加载的计算变量,以防止在您的视图控制器上触发,以便手势识别器可以访问它们'选择器方法(选择器中的self
暗示所有这些都在视图控制器中。)
lazy var alert: UIAlertController = {
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
alert.addTextField(configurationHandler: nil)
let appendAction = self.appendAction
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
alert.addAction(appendAction)
alert.addAction(cancelAction)
let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.append(sender:)))
gestureRecognizer.minimumPressDuration = 0.0
alert.view.addGestureRecognizer(gestureRecognizer)
return alert
}()
lazy var appendAction: UIAlertAction = {
return UIAlertAction(title: "Paste Message", style: .default, handler: nil)
}()
确保上面的手势识别器设置为UILongPressGestureRecognizer
,最小按下持续时间为0.这样,您可以在完全触发操作之前访问手势的状态(用户触摸时)。在那里,您可以禁用UIAlertAction
,实现自定义代码,并在手势完成后重新启用操作(用户已触摸)。见下文:
@objc func append(sender: UILongPressGestureRecognizer) {
if sender.state == .began {
appendAction.isEnabled = false
} else if sender.state == .ended {
// Do whatever you want with the alert text fields
print(alert.textFields![0].text)
appendAction.isEnabled = true
}
}
然后你只需出示UIAlertController
。
@IBAction func showAlert(sender: AnyObject) {
self.present(alert, animated: true, completion: nil)
}
这显然是一个黑客攻击,但我没有别的方法可以在没有黑客的情况下实现这一点,因为它并不意味着要实现。例如,手势识别器绑定到UIAlertController
,因此如果用户点击警报上的任何位置(除了取消按钮),用户就可以触发该方法。
原始答案:
这就像我可以接近黑客一样。如果有某种方法可以将解雇转换时间自定义为空,那么您可以将animated:
设置为false,它看起来就像是相同的提醒,但我认为它不可能
class ViewController: UIViewController {
@IBAction func alert(sender: AnyObject) {
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .Alert)
alert.addTextFieldWithConfigurationHandler(nil)
let appendAction = UIAlertAction(title: "Append text", style: .Default) { _ in
var textField = alert.textFields![0] as UITextField
// Append text here
self.presentViewController(alert, animated: true, completion: nil)
}
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
alert.addAction(appendAction)
alert.addAction(cancelAction)
self.presentViewController(alert, animated: true, completion: nil)
}
}
我只熟悉swift
答案 1 :(得分:0)
几乎同样的问题已经回答here
警报上的文字字段支持粘贴选项,因此没有真正的理由在警报上设置单独的按钮以指示“粘贴”选项。
否则你应该模仿UIAlertController并用desiread行为重新实现它。