J'essaye de faire une vue popup de confirmation de suppression. Parce que le design que je veux est très différent du style de la pop-up UIAlertView
typique, j'ai décidé de créer un ConfirmationViewController
personnalisé que je voudrais déclencher à popup.Swift Personnalisé UIAlertView
Voici ce que le UIAlertView
typique ressemble à:
Et voici ce que je veux moi à ressembler à:
Voici comment je fais actuellement mon habitude ConfirmationViewController
popup:
let confirmationViewController = ConfirmationViewController()
confirmationViewController.delegate = self
confirmationViewController.setTitleLabel("Are you sure you want to remove \(firstName)?")
confirmationViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
confirmationViewController.preferredContentSize = CGSizeMake(230, 130)
let popoverConfirmationViewController = confirmationViewController.popoverPresentationController
popoverConfirmationViewController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
popoverConfirmationViewController?.delegate = self
popoverConfirmationViewController?.sourceView = self.view
popoverConfirmationViewController?.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds),0,0)
presentViewController(
confirmationViewController,
animated: true,
completion: nil)
Et voici comment je reçois la notification lorsque le CANCEL
ou le bouton REMOVE
est pressé:
extension UserProfileTableViewController: ConfirmationViewControllerDelegate {
func cancelButtonPressed() {
print("Cancel button pressed")
}
func confirmationButtonPressed(objectToDelete: AnyObject?) {
print("Delete button pressed")
}
}
Cependant, ce que je veux sur l'utilisation d'un UIAlertView
est que je peux coder en dur dans l'action que je veux exécuter lorsqu'un bouton particulier est pressé, comme ceci:
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .Alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: {(ACTION) in
print("Perform cancel action")
})
let deleteAction = UIAlertAction(title: "Remove", style: .Destructive, handler: {(ACTION) in
print("Perform delete action")
})
alertController.addAction(cancelAction)
alertController.addAction(deleteAction)
presentViewController(alertController, animated: true, completion: nil)
donc ma question est, comment puis-je créer un gestionnaire d'achèvement (en ligne) de telle sorte que lorsque le bouton CANCEL
ou REMOVE
est pressé avec mon habitude ConfirmationViewController
Je peux déclencher l'action, tout comme j'ai montré comment cela se fait avec le UIAlertController
, au lieu de la façon dont je le fais actuellement avec la délégation?
Est-ce que la réponse est juste de créer le popup personnalisé que je recherche avec un UIAlertController
? Et si oui, comment puis-je le personnaliser au degré que je recherche?
Merci à l'avance et désolé pour le long post :)
post-scriptum Voici ce que mon ConfirmationViewController
et ConfirmationViewControllerDelegate
ressembler à:
protocol ConfirmationViewControllerDelegate {
func cancelButtonPressed()
func confirmationButtonPressed(objectToDelete: AnyObject?)
}
class ConfirmationViewController: UIViewController {
var didSetupConstraints = false
let titleLabel = UILabel.newAutoLayoutView()
let buttonContainer = UIView.newAutoLayoutView()
let cancelButton = ButtonWithPressingEffect.newAutoLayoutView()
let confirmationButton = ButtonWithPressingEffect.newAutoLayoutView()
var delegate: ConfirmationViewControllerDelegate?
var objectToDelete: AnyObject?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.whiteColor()
titleLabel.numberOfLines = 0
cancelButton.backgroundColor = UIColor.colorFromCode(0x7f7f7f)
cancelButton.layer.cornerRadius = 5
cancelButton.setAttributedTitle(NSMutableAttributedString(
string: "CANCEL",
attributes: [
NSFontAttributeName: UIFont(name: "AvenirNextLTPro-Demi", size: 12)!,
NSForegroundColorAttributeName: UIColor.whiteColor(),
NSKernAttributeName: 0.2
]
), forState: UIControlState.Normal)
cancelButton.addTarget(self, action: #selector(cancelButtonPressed), forControlEvents: .TouchUpInside)
confirmationButton.backgroundColor = Application.redColor
confirmationButton.layer.cornerRadius = 5
confirmationButton.setAttributedTitle(NSMutableAttributedString(
string: "REMOVE",
attributes: [
NSFontAttributeName: UIFont(name: "AvenirNextLTPro-Demi", size: 12)!,
NSForegroundColorAttributeName: UIColor.whiteColor(),
NSKernAttributeName: 0.2
]
), forState: UIControlState.Normal)
confirmationButton.addTarget(self, action: #selector(confirmationButtonPresssed), forControlEvents: .TouchUpInside)
view.addSubview(titleLabel)
view.addSubview(buttonContainer)
buttonContainer.addSubview(cancelButton)
buttonContainer.addSubview(confirmationButton)
updateViewConstraints()
}
func cancelButtonPressed() {
delegate?.cancelButtonPressed()
dismissViewControllerAnimated(false, completion: nil)
}
func confirmationButtonPresssed() {
delegate?.confirmationButtonPressed(objectToDelete)
dismissViewControllerAnimated(false, completion: nil)
}
func setTitleLabel(text: String) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.Center
paragraphStyle.lineSpacing = 4.5
titleLabel.attributedText = NSMutableAttributedString(
string: text,
attributes: [
NSFontAttributeName: UIFont(name: "AvenirNextLTPro-Regular", size: 14)!,
NSForegroundColorAttributeName: UIColor.colorFromCode(0x151515),
NSKernAttributeName: 0.5,
NSParagraphStyleAttributeName: paragraphStyle
]
)
}
override func updateViewConstraints() {
if !didSetupConstraints {
titleLabel.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsets(top: 10, left: 10, bottom: 0, right: 10), excludingEdge: .Bottom)
titleLabel.autoAlignAxisToSuperviewAxis(.Vertical)
buttonContainer.autoPinEdge(.Top, toEdge: .Bottom, ofView: titleLabel, withOffset: 3)
buttonContainer.autoAlignAxisToSuperviewAxis(.Vertical)
buttonContainer.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 10)
let contactViews: NSArray = [cancelButton, confirmationButton]
contactViews.autoDistributeViewsAlongAxis(.Horizontal, alignedTo: .Horizontal, withFixedSpacing: 7, insetSpacing: true, matchedSizes: false)
cancelButton.autoPinEdgeToSuperviewEdge(.Top)
cancelButton.autoPinEdgeToSuperviewEdge(.Bottom)
cancelButton.autoSetDimensionsToSize(CGSize(width: 100, height: 50))
confirmationButton.autoPinEdgeToSuperviewEdge(.Top)
confirmationButton.autoPinEdgeToSuperviewEdge(.Bottom)
confirmationButton.autoSetDimensionsToSize(CGSize(width: 100, height: 50))
didSetupConstraints = true
}
super.updateViewConstraints()
}
}
est la classe ConfirmationViewController sous votre contrôle et possible d'éditer? – SeanCAtkinson
Yessir, je viens de mettre à jour pour inclure mon code pour le ConfirmationViewController @SeanCAtkinson – Thomas