2015-05-24 2 views
-1

У меня проблема, если программно отключить ViewController. Я подключил оба контроллера, и если я нажму кнопку, появится контроллер. Вот мой метод prepareForSegue:Невозможно отклонить ModalViewController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let VC = VC() 
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) 
    let blurredView = UIVisualEffectView(effect: blurEffect) 
    blurredView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + 64) 

    VC.view.frame = self.view.bounds 
    VC.view.backgroundColor = UIColor.clearColor() 
    VC.view.addSubview(blurredView) 
    VC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

    var masterViewOfVC = (segue.destinationViewController as! SubjectSelectionViewController).masterView 

    blurredView.addSubview(masterViewOfVC) 

    masterViewOfVC.setTranslatesAutoresizingMaskIntoConstraints(false) 

    let views = ["masterView": masterViewOfVC] 

    let horizontalConstraintsForMasterView = NSLayoutConstraint.constraintsWithVisualFormat("H:|[masterView]|", options: .AlignAllCenterY, metrics: nil, views: views) 
    blurredView.addConstraints(horizontalConstraintsForMasterView) 
    let verticalConstraintsForMasterView = NSLayoutConstraint.constraintsWithVisualFormat("V:|[masterView]|", options: .AlignAllCenterX, metrics: nil, views: views) 
    blurredView.addConstraints(verticalConstraintsForMasterView) 

    (segue.destinationViewController as! VC).viewDidLoad() 

    self.presentViewController(VC, animated: true, completion: nil) 
} 

Так и если я стараюсь, чтобы закрыть его это не делать ничего. Я уже проверил, работают ли кнопки, и это так.

Вот мой код от другого контроллера:

// viewDidLoad

cancelButton.setTitle("Abbrechen", forState: UIControlState.Normal) 
    cancelButton.tintColor = UIColor.whiteColor() 
    cancelButton.addTarget(self, action: Selector("buttonAction:"), forControlEvents: UIControlEvents.TouchUpInside) 
    cancelButton.enabled = true 

// моя функция

func buttonAction(sender:UIButton!) { 
    VC().dismissViewControllerAnimated(true, completion: nil) 
} 

UPDATE


Я удалить SEGUE в моем Storyboar d и я создал modal segue в IBAction моей Button. Я также инициализирую свою кнопку «отмена» в этом действии.

Вот мой код из parentViewController:

@IBAction func SubjectSelctionButtonPressed(sender: UIBarButtonItem) { 
    let subjectSelectionViewController = SubjectSelectionViewController() 
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) 
    let blurredView = UIVisualEffectView(effect: blurEffect) 
    blurredView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + 64) 

    subjectSelectionViewController.view.frame = self.view.bounds 
    subjectSelectionViewController.view.backgroundColor = UIColor.clearColor() 
    subjectSelectionViewController.view.addSubview(blurredView) 
    subjectSelectionViewController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

    var masterViewOfSubjectSelection = SubjectSelectionViewController().masterView 
    var buttonOfSubjectSelection = SubjectSelectionViewController().cancelButton 

    buttonOfSubjectSelection.setTitle("Abbrechen", forState: UIControlState.Normal) 
    buttonOfSubjectSelection.tintColor = UIColor.whiteColor() 
    buttonOfSubjectSelection.addTarget(self, action: Selector("buttonAction:"), forControlEvents: UIControlEvents.TouchUpInside) 

    blurredView.addSubview(masterViewOfSubjectSelection) 
    masterViewOfSubjectSelection.addSubview(buttonOfSubjectSelection) 

    masterViewOfSubjectSelection.setTranslatesAutoresizingMaskIntoConstraints(false) 

    let views = ["masterView": masterViewOfSubjectSelection] 

    let horizontalConstraintsForMasterView = NSLayoutConstraint.constraintsWithVisualFormat("H:|[masterView]|", options: .AlignAllCenterY, metrics: nil, views: views) 
    blurredView.addConstraints(horizontalConstraintsForMasterView) 
    let verticalConstraintsForMasterView = NSLayoutConstraint.constraintsWithVisualFormat("V:|[masterView]|", options: .AlignAllCenterX, metrics: nil, views: views) 
    blurredView.addConstraints(verticalConstraintsForMasterView) 

    self.presentViewController(subjectSelectionViewController, animated: true, completion: nil) 
} 

и действие от кнопки выглядит следующим образом:

func buttonAction(sender:UIButton!) { 
    dismissViewControllerAnimated(true, completion: nil) 
} 

нормально теперь, когда контроллер представления нет ничего, кроме моих элементов который я создал в действии. Мой метод viewDidLoad() мой представляющий контроллер называется, но ограничения и formattings не дозвонились ...

Вот мой viewDidLoad() мой modalViewController:

 titleLabel.setTranslatesAutoresizingMaskIntoConstraints(false) 
    cancelButton.setTranslatesAutoresizingMaskIntoConstraints(false) 
    separatorLine.setTranslatesAutoresizingMaskIntoConstraints(false) 
    subjectsTableView.setTranslatesAutoresizingMaskIntoConstraints(false) 

    subjectsTableView.delegate = self 

    titleLabel.text = "Unterrichtsfächer" 
    titleLabel.textColor = UIColor.whiteColor() 
    titleLabel.font = UIFont(name: "HelveticaNeue-Medium", size: 17) 

    separatorLine.backgroundColor = UIColor.whiteColor() 

    subjectsTableView.backgroundColor = UIColor.clearColor() 

    masterView.addSubview(titleLabel) 
    masterView.addSubview(cancelButton) 
    masterView.addSubview(separatorLine) 
    masterView.addSubview(subjectsTableView) 

    let views = ["line": separatorLine, "title": titleLabel, "button": cancelButton, "table": subjectsTableView] 

    let verticalConstraintsForElements = NSLayoutConstraint.constraintsWithVisualFormat("V:|-64-[line(2)][table]|", options: .AlignAllCenterX, metrics: nil, views: views) 
    masterView.addConstraints(verticalConstraintsForElements) 
    let horizontalConstraintsForSeparatorLine = NSLayoutConstraint.constraintsWithVisualFormat("H:|[line]|", options: .AlignAllCenterY, metrics: nil, views: views) 
    masterView.addConstraints(horizontalConstraintsForSeparatorLine) 
    let horizontalConstraintsForTableView = NSLayoutConstraint.constraintsWithVisualFormat("H:|[table]|", options: .AlignAllCenterY, metrics: nil, views: views) 
    masterView.addConstraints(horizontalConstraintsForTableView) 

    let verticalConstraintsForTitleLabel = NSLayoutConstraint.constraintsWithVisualFormat("V:[title(21)]-11-[line]", options: .AlignAllCenterX, metrics: nil, views: views) 
    masterView.addConstraints(verticalConstraintsForTitleLabel) 

    let horizontalAlignmentForTitleLabel = NSLayoutConstraint(item: titleLabel, attribute: NSLayoutAttribute.CenterX, relatedBy: .Equal, toItem: masterView, attribute: .CenterX, multiplier: 1, constant: -18) 
    masterView.addConstraint(horizontalAlignmentForTitleLabel) 
    let widthForTitleLabel = NSLayoutConstraint(item: titleLabel, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 137) 
    masterView.addConstraint(widthForTitleLabel) 

    let verticalConstraintsForCancelButton = NSLayoutConstraint.constraintsWithVisualFormat("V:[button(30)]-6-[line]", options: .AlignAllCenterX, metrics: nil, views: views) 
    masterView.addConstraints(verticalConstraintsForCancelButton) 
    let horizontalConstraintsForCancelButton = NSLayoutConstraint.constraintsWithVisualFormat("H:[button(90)]-7-|", options: .AlignAllCenterY, metrics: nil, views: views) 
    masterView.addConstraints(horizontalConstraintsForCancelButton) 

Может кто-нибудь помочь мне ? Большое спасибо !!!

+0

ваш 'buttonAction' увольняет новый экземпляр' VC', а не тот, который уже существует. – Eendje

+0

ok ... Как я могу это исправить? –

+0

Я вижу несколько проблем. Segue создает экземпляр контроллера точки назначения для вас. Почему вы делаете 'let VC = VC()'? Кроме того, вы не должны вызывать 'viewDidLoad()', который вызывается системой. В-третьих, вы вызываете 'presentViewController' внутри' prepareForSegue'. Если вы используете segues, вам не нужен 'presentViewController'. – vacawama

ответ

0

Я действительно не проверял весь ваш код, но чтобы быстро исправить его, вы можете сделать экземпляр VC классом.

Так это будет выглядеть примерно так:

class MainViewController: UIViewController { 
    var VC = UIViewController() // I would use an optional here but I've been down voted for suggesting people to use optionals. 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     VC = VC() 

     // Your code 
    } 

    func buttonAction(sender:UIButton!) { 
     VC.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

Здесь я предполагаю, что вы используете какой-то мастер - подробный вид так buttonAction все еще доступна, когда вы непосредственно перейти к VC.

Если buttonAction является метод VC сам, то просто позвоните dissmissViewControllerAnimated() на себя с:

func buttonAction(sender:UIButton!) { 
    dismissViewControllerAnimated(true, completion: nil) 
} 

Так или иначе, вы должны вызвать dissmissViewControllerAnimated() на экземпляре VC. С помощью VC() вы просто создадите экземпляр , который имеет «ничего», что связано с тем, что уже существует.

Update:
Если вы создали SubjectSelectionViewController() в раскадровку, то вы, вероятно, хотите создать его экземпляр с:

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
let subjectSelectionViewController = storyboard.instantiateViewControllerWithIdentifier("YourIdentifier") as! SubjectSelectionViewController 
+0

У меня также есть предупреждение. Может быть, это что-то важное? Предупреждение: попытайтесь представить в , который уже представляет –

+0

Ну, как сказал vacawama, в вашем коде есть много вещей, которые сомнительны. Мой ответ просто предоставляет вам простое решение вашей проблемы. Ну, это как-то связано с тем, что сказал vacawama. Вы уже готовитесь к переходу, а также с помощью 'presentViewController' для представления контроллера вида. – Eendje

+0

Возможно, вы захотите, чтобы этот код отображал этот 'VC' в вашей' IBAction' вашей кнопки вместо использования segue. – Eendje

0

Ваша проблема в том, что вы не толкая другой вид отклонить это, вы просто добавить новый контроллер представления поверх другого вида Вам нужно заменить эту линию

blurredView.addSubview(masterViewOfVC) 

Для

presentViewController(masterViewOfVC, animated: true, completion: nil) 

Теперь, когда вы вызываете отклонить вид контроллера все должны просто работать

Смежные вопросы