如何从不同的视图控制器调用函数?
How do I call a function from a different view controller?
我有一个基本上是笔记应用程序的东西,我正在尝试从一个视图控制器调用另一个视图控制器中的函数。我该怎么做,或者有更好的方法吗?
这里是我尝试调用函数的地方
class NoteDetailViewController: UIViewController
{
@IBOutlet weak var funcButton: UIButton!
@IBAction func funcButTouched(sender: UIButton)
{
// where i want to call the function
}
}
以及功能在哪里
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
}
}
}
}
我试过只创建一个 ListTableViewController 的实例并以这种方式调用该函数,但我收到了一个错误。
你可以使用 delegation.
首先,声明一个委托协议。这应该在您的 NoteDetailViewController.swift
文件中,但在 class
声明之外:
protocol NoteDetailViewControllerDelegate: class {
func noteDetailViewControllerButtonTouched(controller: NoteDetailViewController)
}
接下来,将代表 属性 添加到您的 NoteDetailViewController
:
weak var delegate: NoteDetailViewControllerDelegate?
现在,我们使用 @IBAction
来告诉委托人,这将是 ListTableViewController
:
@IBAction func funcButTouched(sender: UIButton)
{
delegate?.noteDetailViewControllerButtonTouched(self)
}
最后,回到 ListTableViewController
(假设这个控制器是显示 NoteDetailViewController
之前的控制器),遵守协议并使用 prepareForSegue
将委托设置为它自己:
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
}
}
}
只需按照下面的代码操作即可,非常简单 :-
NoteDetailViewController.swift:
class NoteDetailViewController: UIViewController
{
@IBOutlet weak var funcButton: UIButton!
var parentListTableView : ListTableViewController!
@IBAction func funcButTouched(sender: UIButton)
{
parentListTableView.wordCount()
}
}
ListTableViewController.swift:
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
}
}
}
我有一个基本上是笔记应用程序的东西,我正在尝试从一个视图控制器调用另一个视图控制器中的函数。我该怎么做,或者有更好的方法吗?
这里是我尝试调用函数的地方
class NoteDetailViewController: UIViewController
{
@IBOutlet weak var funcButton: UIButton!
@IBAction func funcButTouched(sender: UIButton)
{
// where i want to call the function
}
}
以及功能在哪里
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
}
}
}
}
我试过只创建一个 ListTableViewController 的实例并以这种方式调用该函数,但我收到了一个错误。
你可以使用 delegation.
首先,声明一个委托协议。这应该在您的 NoteDetailViewController.swift
文件中,但在 class
声明之外:
protocol NoteDetailViewControllerDelegate: class {
func noteDetailViewControllerButtonTouched(controller: NoteDetailViewController)
}
接下来,将代表 属性 添加到您的 NoteDetailViewController
:
weak var delegate: NoteDetailViewControllerDelegate?
现在,我们使用 @IBAction
来告诉委托人,这将是 ListTableViewController
:
@IBAction func funcButTouched(sender: UIButton)
{
delegate?.noteDetailViewControllerButtonTouched(self)
}
最后,回到 ListTableViewController
(假设这个控制器是显示 NoteDetailViewController
之前的控制器),遵守协议并使用 prepareForSegue
将委托设置为它自己:
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
}
}
}
只需按照下面的代码操作即可,非常简单 :-
NoteDetailViewController.swift:
class NoteDetailViewController: UIViewController
{
@IBOutlet weak var funcButton: UIButton!
var parentListTableView : ListTableViewController!
@IBAction func funcButTouched(sender: UIButton)
{
parentListTableView.wordCount()
}
}
ListTableViewController.swift:
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
}
}
}