2015-09-12 59 views
0

我無法使用以下代碼從超級視圖中刪除? 這是什麼?我嘗試了一切,但似乎它根本不工作。我添加更多的細節,所以我沒有得到這個非常惱人的警報,告訴我,我的帖子主要是代碼....無法從超級視圖中刪除(swift2)

let controller = storyboard!.instantiateViewControllerWithIdentifier("OrderViewController") 
      controller.view.frame = CGRectMake(self.view.frame.size.width/2 - 100, self.view.frame.size.height/2 - 100, 200, 200) 

     if sender.selected { 

      sender.selected = false 

      controller.view.transform = CGAffineTransformIdentity 

      [UIView .animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 

       controller.view.transform = CGAffineTransformMakeScale(0.01, 0.01); 

       }, completion: { finished in 

       controller.willMoveToParentViewController(nil) 
       controller.view .removeFromSuperview() 
       controller.removeFromParentViewController() 


      })] 
      print("close") 

     } 

     else { 

      sender.selected = true 

      addChildViewController(controller) 
      view.addSubview(controller.view) 
      controller.didMoveToParentViewController(self) 

      controller.view.transform = CGAffineTransformMakeScale(0.01, 0.01); 
      [UIView .animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 

       controller.view.transform = CGAffineTransformIdentity 

       }, completion: nil)] 


      print("present") 

     } 

回答

1

有一個奇怪的Objective-C語法組合(UIView動畫塊周圍的方括號)和swift。如果這個編譯沒有錯誤,我很驚訝!

你幾乎在那裏,主要的問題是,每調用一段代碼就會實例化一個'OrderViewController'的新實例。

你只想創建它,如果它不存在(當你想顯示它)。當你準備好隱藏它時,你想獲得對現有控制器的引用,並執行動畫等來隱藏它。

爲此,您需要在該代碼塊的本地範圍之外保留對其的引用。

這裏是你展示如何可能做到這一點的例子:

import UIKit 

class ViewController: UIViewController { 

    // keep a reference to the OrderViewController after it's been created 
    var controller:UIViewController? 

    @IBAction func buttonTapped(sender: AnyObject) { 

     // instead of using button selected state, just check to see if 
     // self.controller is nil or not 

     if let existingController = self.controller { 
      // controller already exists, lets hide it 

      existingController.view.transform = CGAffineTransformIdentity 

      UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 

       existingController.view.transform = CGAffineTransformMakeScale(0.01, 0.01); 

       }, completion: { _ in 

        existingController.willMoveToParentViewController(nil) 
        existingController.view.removeFromSuperview() 
        existingController.removeFromParentViewController() 

        // make this nil, so that next time the button is 
        // tapped we'll go though the process of creating it again 
        self.controller = nil 

      }) 
      print("close") 
     } 
     else { 
      // controller doesn't exist, lets instanstiate and show it 

      let newController = storyboard!.instantiateViewControllerWithIdentifier("OrderViewController") 

      newController.view.frame = CGRectMake(self.view.frame.size.width/2 - 100, self.view.frame.size.height/2 - 100, 200, 200) 

      addChildViewController(newController) 
      view.addSubview(newController.view) 
      newController.didMoveToParentViewController(self) 

      newController.view.transform = CGAffineTransformMakeScale(0.01, 0.01) 

      UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 

       newController.view.transform = CGAffineTransformIdentity 

       }, completion: { _ in 

        // keep a reference to this controller you've just created, 
        // so that next time the button is tapped you can close it 
        self.controller = newController 
      }) 

      print("present") 

     } 
    } 
} 

如果你在一個非常簡單的應用程序(只是一對夫婦的屏幕)工作那麼這個方法是好的。

但是....如果您計劃更復雜的事情,您可能需要使用自定義UISegueUIPresentationControllerUIViewControllerAnimatedTransitioning的混合進行調查,以便所有動畫邏輯都不會鎖定到您的查看控制器代碼。

+0

謝謝你。我確實來自obj-c背景,仍然試圖掌握新的語法。只是一個問題,但。爲什麼檢查控制器是否爲零而不是使用所選按鈕然後檢查更好? –

+0

不客氣!使用按鈕選擇對你的邏輯沒有任何問題,但是對我來說,使用控制器的可選狀態(「不存在嗎?make it!」,「已經存在?刪除它!」)對於我來說更自然一些。 。按鈕選擇狀態(「hmm,確定'是指創建還是移除控制器?」)。另外,如果你從Obj-C切換到Swift,你應該花時間閱讀和真正理解可選項,並且你明白像'if let existingController = self.controller'這樣的語句。 – MathewS

+0

謝謝隊友。非常感謝您的意見! –

相關問題