从Swift iOS中的Modal View获取价值

时间:2015-04-05 21:23:27

标签: ios swift delegates protocols

我正在尝试开始编写Swift,我正试图从模态视图控制器中获取一个没有运气的值。

我有两个控制器,ViewController和modalViewController。

在ViewController中,我有一个UITableView,只需按一下按钮,我就可以打开modalViewController。

然后从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.
}

}

我在代码中没有错误,代表没有工作,它总是没有。

感谢。

3 个答案:

答案 0 :(得分:1)

您必须在第一个视图控制器中分配代理。 此外,您必须将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来设置委托。

答案 1 :(得分:0)

您必须先设置modalViewController的{​​{1}}媒体资源。如果您正在使用segues,则可以在delegate中执行此操作。

此外,类名应以大写字母开头(prepareForSegue(_:)应为modalViewController)。只有实例应以小写字母开头。

答案 2 :(得分:0)

另一种选择是使用展开segue而不是使用委托。这是一个教程: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.
        }
    }

然后将链接生成器中的所有内容链接起来,如教程中所示。