2016-02-05 25 views
0

我已經開始通過在Swift編程語言上完成一些在線課程來學習編程。我正在試驗一個Xcode項目,其中我的主要故事板中有兩個視圖控制器。使用Swift,如何從另一個視圖控制器中的按鈕調用一個視圖控制器中編碼的函數?

在項目中,我有一個按鈕,把我從視圖控制器1查看控制器2.查看控制器2有三個按鈕:

  • 一個通過郵件應用程序觸發一個新的電子郵件
  • 一個關閉屏幕並將用戶返回到第一個視圖控制器屏幕
  • 第三個應該調用一個函數(位於第一個視圖控制器的ViewController.swift中的代碼)。

有問題的功能其實很簡單:

func ResetGame() 
{ 
    PlaySoundButton() 
    score = 0 
    totalquestionsasked = 0 

} 

我已經失去了的我試圖得到這個工作的所有方式計數了,但是我認爲這將只是一個

@IBAction func buttonResetGame(sender: UIButton) { 

    ResetGame() 
} 

或者

@IBAction func buttonResetGame(sender: AnyObject) { 

     ResetGame() 
    } 
:用代碼在第二視圖中的下面演示之一直接的鍵

但當然這會導致使用未解析標識符'ResetGame'錯誤。

我也嘗試了按鈕的代碼中直接編碼功能按照下面的例子:

@IBAction func buttonResetGame(sender: UIButton) { 

    PlaySoundButton() 
    score = 0 
    totalquestionsasked = 0 

} 

但是,當然,這也不能工作。

我研究了這一點,它似乎可以在Objective C和其他編程語言中,但我似乎無法找到使用Swift的示例。這是否意味着這是不可能的,或只是它不是做的事情?

總結:

  • 這可能嗎?
  • 如果是這樣,怎麼樣?
  • 如果不推薦,爲什麼不呢?
  • 最後,跨視圖控制器使用函數的推薦方法是什麼?
+0

你能發表一些代碼嗎?特別是有問題的功能。然後,我們可以就最佳解決方案提供建議。 –

+0

@Renk不用擔心,只是編輯了包含代碼的問題。正如你所看到的,這個功能非常簡單。 – Monomeeth

+0

谷歌單身人士和代表團。這個問題之前已經被問過很多次了,並且迅速有很好的答案。 –

回答

1

一般而言,這是可能的,但不推薦,因爲View Controller用於顯示視圖,而不是用於跨不同視圖控制器共享功能。

你應該通過創建一個獨立的類來從兩個視圖控制器中引用,你可以在其中定義這個函數,它具有通用的功能。

EDITED: 如果你不想從2個視圖控制器共享共同的功能,但你只需要調用從另一個控制器一些代碼,你可以使用委託模式一樣

class FirstController: UIViewController, YourProtocol { 

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

     if segue?.identifier == "yourSegueName" { 
      let viewController = segue!.destinationViewController as! SecondController 
      viewController.controller = self 
     } 
    } 

    func someFunction() { 

    } 
} 

class SecondController: UIViewController { 

    var controller: YourProtocol? // reference to the delegate alias First Controller 

     override func viewDidLoad() { 
       super.viewDidLoad() 
       controller.someFunction() // call function from the delegate alias first controller 
    } 

} 

protocol YourProtocol { 

    func someFunction() 

} 
+0

好吧,那麼,我可以創建自己的課程,然後在整個應用程序中提供,而不管視圖控制器等等。這相當簡單嗎? – Monomeeth

+0

是的,當然。您只需創建一個類,然後在兩個控制器中實例化它,並在需要時調用該函數。如果該功能爲兩個視圖控制器執行通用功能,這是一個很好的做法。 – Lubos

+0

好的,太棒了!我不斷學習新事物! :)我會看看我可以找到如何做到這一點。謝謝! – Monomeeth

0

要調用ResetGame(),您需要第一個視圖控制器的實例,那麼您可以撥打instance.ResetGame()。您可以將第一個視圖控制器的實例傳遞給第二個視圖控制器使用

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
      let secondViewController = segue.destinationViewController as! SecondViewController 
      destinationVC.instance = self 
     } 
+1

錯誤的傳遞數據的方向;)但是這會產生可怕的代碼味道。永遠不要這樣做。用'prepareForSegue'向前發送數據然後創建一個下降委派模式來傳回數據。 –

+0

@RMenke我點擊第一個視圖控制器上的按鈕時,我正在將第一個視圖控制器的實例傳遞給第二個,所以我認爲方向是正確的。同意不應該通過視圖控制器的實例和下降代理模式會更好。不包括保持簡單的答案。 – 2ank3th

+0

@ 2ank3th好的,如果我嘗試這樣做,我需要導入某種框架?我得到了一個未聲明類型的ProductSKUDetailsTableViewController_錯誤。 – Monomeeth

相關問題