UIAlertController
が消えないようにしたいと思います。
UIAlertTextFieldに文字列を追加するだけのUIAlertAction
がありますが、タップするとView Controllerが削除されます[不要]。望ましくない結果を伴う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にnoを設定しようとしました。
[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:
に設定すると、単にnotに設定されることに気付きました。実際の解雇プロセスを停止するためでした。私の目標に関連して私が試したものを単に提供する。また、pasteMessageを選択するときにnewUIAlertController
を表示しようとしましたnewUIAlertControllers
コピーされたメッセージを含むtextField、それは動作しますが、何ができるかにはあまりにもハッキングだと感じています。
編集:
Swiftに更新
だから私は実際にこれを機能させました。つまり、解雇が発生する前にトリガーするジェスチャレコグナイザーをUIAlertController
に追加する必要があります。
まず、UIAlertController
およびUIAlertAction
の遅延ロードされた計算変数を作成し、ジェスチャーコントローラーのセレクターメソッド(self
は、これらすべてがView Controller内にあることをほのめかします)。
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)
}()
上記のジェスチャレコグナイザが、最小のプレス時間0で設定されたUILongPressGestureRecognizer
であることを確認してください。そうすることで、アクションが完全にトリガーされる前にジェスチャの状態にアクセスできます。そこで、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)
}
}
私はスウィフトにしか精通していない
ほぼ同じ質問に答えます here
アラートのテキストフィールドは貼り付けオプションをサポートしているため、「貼り付け」オプションを示す別のボタンをアラートに表示する本当の理由はありません。
それ以外の場合は、UIAlertControllerを模倣し、desireadの動作で再実装する必要があります。