防止UIAlertController解雇

时间:2015-03-07 20:31:53

标签: ios uialertcontroller

我想阻止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,但它可以正常工作,但是对于可以做的事情,我觉得这太糟糕了。

2 个答案:

答案 0 :(得分:26)

修改

针对Swift 3进行了更新

所以我真的让这个工作了。简而言之,它涉及在解雇发生之前触发的UIAlertController添加手势识别器。

首先,为您的UIAlertControllerUIAlertAction创建延迟加载的计算变量,以防止在您的视图控制器上触发,以便手势识别器可以访问它们'选择器方法(选择器中的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行为重新实现它。