Swift 2.2:视图控制器iOS之间传递值

时间:2016-08-25 13:02:03

标签: ios swift xcode storyboard segue

我正在尝试在两个视图控制器之间传递值,但它失败了。 当按下第一视图控制器中的按钮时,第二视图控制器(其为表视图控制器)以模态呈现。

当用户点击第二个视图控制器中存在的任何单元格时,它将被解除,并且单元格的值将设置为第一个视图控制器中的按钮。

以下是我用过的代码:

ForgotPasswordViewController

class ForgotPasswordViewController: UIViewController {

    var securityQuestion = ""

    @IBOutlet weak var btnSecurityQuestion: UIButton!

    //MARK: - viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    var secQuestionAccessor: (String) {
        get{
            return securityQuestion
        }set(param) { print("param : \(param)") //Value is correctly printed in console
           securityQuestion = param
            print("securityQuestion : \(securityQuestion)")  //Value is correctly printed in console
        }
    }

    //MARK: - viewWillAppear
    override func viewWillAppear(animated: Bool) {        
        . . .

        print("secQuestionAccessor : \(secQuestionAccessor)") //Value is empty here

        if secQuestionAccessor == "" {
            btnSecurityQuestion.setTitle("Select", forState: UIControlState.Normal)
        }
        else {
            btnSecurityQuestion.setTitle(secQuestionAccessor, forState: UIControlState.Normal)
        }
        . . .
    }
  . . .
}

SecurityQuestionViewController:

class SecurityQuestionViewController: UITableViewController {
  . . .

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let objForgotPassword = ForgotPasswordViewController()
        print("\(responseQuestion.objectAtIndex(indexPath.row) as! String)") //Value printed correctly here
        objForgotPassword.secQuestionAccessor = responseQuestion.objectAtIndex(indexPath.row) as! String
        self.dismissViewControllerAnimated(true, completion: nil)
    }
  . . .
}

Screenshot 1

我哪里出错了?还有其他解决办法吗?

这个link帮助使用Swift语言创建委托。 但是,app crashes when second view controller is presented using modal segue.

当委托被声明为弱并且在第二个视图控制器中设置为nil时崩溃。它适用于show segue。

如何使用模态segue来完成?

2 个答案:

答案 0 :(得分:5)

使用一个函数向您的SecurityQuestionViewController添加一个协议,该函数接受您想要传递给前一个viewController的数据作为参数。在ForgotPasswordViewController实现该功能。在关闭代理人的SecurityQuestionViewController调用函数之前。

答案 1 :(得分:0)

好的兄弟我可以给你线索......不需要通知,不需要协议......

做一件事只需从导航层次结构中获取父视图控制器的实例并访问其中要设置数据的属性变量

如果您要呈现View控制器,则通过此

访问父级
ParentVC *objParentVC = self.presentingViewController

如果您正在推送视图控制器,则通过

访问父级
ParentVC *objParentVC = [[self.navigationController childViewController] objectAtIndex:self.navigationController.childViewController.count - 2];

只是为了澄清。 如果你-2将成为你的父母。 -1将是您当前的视图控制器。作为计数