2017-07-31 34 views
-1
class ViewController: UIViewController 
{ 
    @IBAction func button_down(_ sender: Any) 
    { 
     do_something(view: myView); 
    } 

    override func viewDidLoad() 
    { 
     super.viewDidLoad(); 

     let screen_size: CGRect = UIScreen.main.bounds; 
     var myView = UIView(frame: CGRect(x: 0, y: screen_size.height/2 - screen_size.width/2, width: screen_size.width, height: screen_size.width)); 
     myView.backgroundColor = UIColor.red; 
     self.view.addSubview(myView); 
    } 
} 

當我嘗試編譯此代碼創建的視圖,我得到一個錯誤:如何訪問viewDivLoad

Use of unresolved identifier 'myView' 

我怎樣才能解決這個問題?我試圖在viewDivLoad之外聲明myView,但這是不允許的。

+0

這是一個名爲「可變範圍」的概念。基本上,你不能聲明一些東西 - 在這種情況下,一個名爲「myView」的UIView在一個函數中,並在第二個函數中引用它。您需要在比viewDidLoad更廣的範圍內定義視圖。例如,將它定義爲一個「實例變量」 - 在你的視圖控制器內但在任何函數之外,然後刪除'viewDidLoad'中的'var'。 (僅供參考,你正在做一些新手的錯誤,比如使用自動佈局來設置幀。使用你的代碼,嘗試在iPhone 4s和iPhone 7上運行它,你會看到我在說什麼。) – dfd

回答

3

對於計算機編程中的「範圍」這個概念,你絕對應該做一些研究 - 如果沒有它,很難走得太遠。 myView只存在於viewDidLoad的範圍內。如果你希望它是可用的那個之外,你可以把它的類的屬性,像這樣:

class ViewController: UIViewController 
{ 
    var myView: UIView! 

    @IBAction func buttonDown(_ sender: Any) 
    { 
     doSomething(view: myView) 
    } 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     let screenSize: CGRect = UIScreen.main.bounds 
     myView = UIView(frame: CGRect(x: 0, y: screenSize.height/2 - screenSize.width/2, width: screenSize.width, height: screenSize.width)) 
     myView.backgroundColor = UIColor.red 
     self.view.addSubview(myView) 
    } 
} 

一對夫婦的其他注意事項:

  • 你不需要在分號在Swift中結束行。
  • 看來你正在使用Interface Builder,所以我建議以這種方式創建myView而不是編程。
  • Swift中的函數和變量名應該是駱駝套 - 所以buttonDown而不是button_down,screenSize而不是screen_size
+0

謝謝諮詢! –