我正试图开始编写Swift,我正试图从模态视图控制器中获取一个值,但没有成功。
我有两个控制器,ViewController和modalViewController。
在ViewController中,我有一个UITableView,只需按下一个按钮,我就可以打开模式ViewController。
然后,我从UITextField传递该值。我已经用delegate和func实现了一个协议,但在某些地方我遗漏了一些东西或出错了。
ViewController.swift
import UIKit
class ViewController: UIViewController,UITableViewDelegate,modalViewControllerDelegate{
@IBOutlet var table: UITableView!
var tableData = ["First Row","Second Row","Third Row"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(animated: Bool) {
table.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(table:UITableView?,numberOfRowsInSection section: Int) -> Int
{
return tableData.count
}
func tableView(table:UITableView?,cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
{
let cell:UITableViewCell = UITableViewCell(style:UITableViewCellStyle.Default,reuseIdentifier:"cell")
cell.textLabel?.text = tableData[indexPath.row]
return cell
}
func sendText(text: NSString) {
tableData.append(text)
} }
modalViewController.swift
import UIKit
protocol modalViewControllerDelegate {
func sendText(var text: NSString)
}
class modalViewController: UIViewController{
let delegate: modalViewControllerDelegate?
@IBOutlet var textField: UITextField?
@IBAction func cancelButton(sender: AnyObject) {
dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func saveButton(sender: AnyObject) {
delegate?.sendText(self.textField!.text)
dismissViewControllerAnimated(true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
}
}
我在代码中没有错误,委托不起作用,它总是为零。
谢谢。
您必须在第一个视图控制器中分配委托。此外,您必须将let delegate: modalViewControllerDelegate?
更改为var,否则您无法更改它。
现在您的代理为空。
目前尚不清楚您是如何访问ModalViewController的。如果你正在使用segues:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "modalViewControllerSegue" {
var destination = segue.destinationViewController as CategoryViewController
destination.delegate = self
}
}
或者,如果你是以编程方式进行:
var modalViewController = ModalViewController(parameters)
modalViewController.delegate = self
presentViewController(modalViewController, animated: true, completion: nil)
情节提要标识符:
let destination = UIStoryboard.mainStoryboard().instantiateViewControllerWithIdentifier("ModalViewController") as ModalViewController
delegate = self
showViewController(destination, sender: nil)
编辑:
如果您想通过选择一个单元格来访问ModalViewController,则需要tableView: didSelectRowAtIndexPath
方法:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("modalViewControllerSegue", sender: self)
}
使用此方法,您将需要方法prepareForSegue
来设置委托。
在显示modalViewController
的delegate
属性之前,您必须设置它。如果您使用segues,则可以在prepareForSegue(_:)
中执行此操作。
此外,类名应该以大写字母开头(modalViewController
应该是ModalViewController
)。只有实例应该以小写字母开头。
另一个选项是使用展开分段,而不是使用委派。以下是教程:http://www.cocoanetics.com/2014/04/unwinding/
在您的情况下,在您的演示视图控制器中,您可以使用以下方法:
func returnFromModalView(segue: UIStoryboardSegue) {
// This is called when returning from the modal view controller.
if let modalVC = segue.sourceViewController as? ModalViewController
where segue.identifier == "mySegueID" {
let text = modalVC.textField.text
// Now do stuff with the text.
}
}
然后在界面生成器中链接所有内容,如教程中所示。