2016-07-05 16 views
0

私は基本的にノートアプリケーションですが、別のビューコントローラにあるビューコントローラにある関数を呼び出そうとしています。私はこれをどうすればいいのですか、それとももっと良い方法がありますか?ここで別のビューコントローラから関数を呼び出すにはどうすればよいですか?

は私が

class NoteDetailViewController: UIViewController 
{ 
    @IBOutlet weak var funcButton: UIButton! 

    @IBAction func funcButTouched(sender: UIButton) 
    { 
    // where i want to call the function 
    } 
} 

そして機能が、私はちょうどListTableViewControllerのインスタンスを作成し、ちょうど関数を呼び出してみた

class ListTableViewController: UITableViewController 
{ 
    // the function 
    func wordCount() 
    { 
     var contentArr = Project.sharedInstance.content.componentsSeparatedByString(" ") 
     for (index, element) in contentArr.enumerate() 
     { 
      let location = conciseArr.indexOf(element) 
      if (location != nil) 
      { 
       contentArr[index] = inflatedArr[location!] 
       afterStr = contentArr.joinWithSeparator(" ") 
       Project.sharedInstance.after = afterStr 
      } 
     } 
    } 
} 

ある道から関数を呼び出すしようとしていますどこですしかし、私はエラーが発生します。

+0

NoteDetailViewController.swift:

class NoteDetailViewController: UIViewController { @IBOutlet weak var funcButton: UIButton! var parentListTableView : ListTableViewController! @IBAction func funcButTouched(sender: UIButton) { parentListTableView.wordCount() } } 

がListTableViewController.swiftを聞いている? –

+0

あなたのUIViewController階層を教えてもらえますか? –

+0

ビューコントローラの順番は? ListTableViewControllerをNoteDetailViewControllerにします。 –

答えて

1

delegationを使用できます。

まず、デリゲートプロトコルを宣言します。これはあなたのNoteDetailViewController.swiftファイルにする必要がありますが、class宣言の外:

protocol NoteDetailViewControllerDelegate: class { 
    func noteDetailViewControllerButtonTouched(controller: NoteDetailViewController) 
} 

次に、あなたのNoteDetailViewControllerにデリゲートのプロパティを追加します。今すぐ

weak var delegate: NoteDetailViewControllerDelegate? 

は、我々は、デリゲートを、伝えるために@IBActionを使用しています(assum ListTableViewControllerに戻って、最後に

@IBAction func funcButTouched(sender: UIButton) 
{ 
    delegate?.noteDetailViewControllerButtonTouched(self) 
} 

ListTableViewControllerになりますこのコントローラをINGのは、プロトコルに準拠し、それ自体にデリゲートを設定するprepareForSegueを使用して、)NoteDetailViewControllerが示されている直接前にいずれかになります。

class ListTableViewController: UITableViewController, NoteDetailViewControllerDelegate { 
    // ... more stuff ... 

    // Implement the delegate protocol 
    func noteDetailViewControllerButtonTouched(controller: NoteDetailViewController) { 
     // Do something! The button was pressed! 
     wordCount() 
    } 
    // Set ourselves as delegate when we are about to show the other view controller 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let yourVC = segue.destinationViewController as? NoteDetailViewController { 
      yourVC.delegate = self 
     } 
    } 
} 

あなたはこのような何かを終える必要があります。

NoteDetailViewController.swift

class NoteDetailViewController: UIViewController 
{ 
    @IBOutlet weak var funcButton: UIButton! 
    weak var delegate: NoteDetailViewControllerDelegate? 

    @IBAction func funcButTouched(sender: UIButton) 
    { 
     delegate?.noteDetailViewControllerButtonTouched(self) 
    } 
} 

protocol NoteDetailViewControllerDelegate: class { 
    func noteDetailViewControllerButtonTouched(controller: NoteDetailViewController) 
} 

ListTableViewController.swift

class ListTableViewController: UITableViewController, NoteDetailViewControllerDelegate 
{ 
    // the function 
    func wordCount() 
    { 
     var contentArr = Project.sharedInstance.content.componentsSeparatedByString(" ") 
     for (index, element) in contentArr.enumerate() 
     { 
      let location = conciseArr.indexOf(element) 
      if (location != nil) 
      { 
       contentArr[index] = inflatedArr[location!] 
       afterStr = contentArr.joinWithSeparator(" ") 
       Project.sharedInstance.after = afterStr 
      } 
     } 
    } 
    // Implement the delegate protocol 
    func noteDetailViewControllerButtonTouched(controller: NoteDetailViewController) { 
     // Do something! The button was pressed! 
     wordCount() 
    } 
    // Set ourselves as delegate when we are about to show the other view controller 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let yourVC = segue.destinationViewController as? NoteDetailViewController { 
      yourVC.delegate = self 
     } 
    } 
} 
+0

'yourVC.delegate = self'行に、「 'ListTableViewController'型の値を 'NoteDetailViewControllerDelegate'とタイプできません」というエラーが表示されます。' –

+0

@SethRodgersクラス宣言の変更を忘れましたか?最初の行を確認してください。 –

+0

しかし、今はすべての作業で 'Project.sharedInstance.after'はafterStrを表示しません。私はそれが価値を得ることを知っているが、単にそれを表示しない。 –

0

だけで怒鳴るコードに、その非常に単純なは、次のとおりです。 - 私は何を理解していない

class ListTableViewController: UITableViewController 
{ 
    // the function 
    func wordCount() 
    { 
     var contentArr = Project.sharedInstance.content.componentsSeparatedByString(" ") 
     for (index, element) in contentArr.enumerate() 
     { 
      let location = conciseArr.indexOf(element) 
      if (location != nil) 
      { 
       contentArr[index] = inflatedArr[location!] 
       afterStr = contentArr.joinWithSeparator(" ") 
       Project.sharedInstance.after = afterStr 
      } 
     } 
    } 

    // Set ourselves as delegate when we are about to show the other view controller 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let yourVC = segue.destinationViewController as? NoteDetailViewController { 
      yourVC.parentListTableView = self 
     } 
    } 
} 
+0

の 'tableView.reloadData()'を呼び出そうとします。これはうまくいくが、 'wordCount'の公開を強制する必要があります。委任により、各ビューコントローラはそれ自身の機能の制御を維持でき、他のビューコントローラがそれらを乱用することはできません。 –

+1

あなたは正しいですが、1つのviewcontrolsのためだけに使用し、次になぜプロトコルを使用する必要があるのか​​と考えています。 –

関連する問題