Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift中从另一个视图控制器设置按钮的标题?_Ios_Swift - Fatal编程技术网

Ios 如何在swift中从另一个视图控制器设置按钮的标题?

Ios 如何在swift中从另一个视图控制器设置按钮的标题?,ios,swift,Ios,Swift,我已经创建了一个视图控制器,允许用户使用MKLocalSearchCompleter搜索地址,并且地址会在表视图中弹出。当用户单击表视图中的地址时,我想将上一个视图控制器中的按钮文本设置为单击的地址。为此,我将标题从MKLocalSearchCompletion设置为在前面的viewController中创建的变量。然后,我在前面的viewController中创建了一个函数,将变量设置为按钮标题。然后我调用了viewController中的函数,该函数在didSelectRowAt函数中搜索按

我已经创建了一个视图控制器,允许用户使用
MKLocalSearchCompleter
搜索地址,并且地址会在
表视图中弹出。当用户单击
表视图中的地址时,我想将上一个视图控制器中的按钮文本设置为单击的地址。为此,我将标题从
MKLocalSearchCompletion
设置为在前面的
viewController
中创建的变量。然后,我在前面的
viewController
中创建了一个函数,将变量设置为按钮标题。然后我调用了
viewController
中的函数,该函数在
didSelectRowAt
函数中搜索按钮的地址。像这样:


AddViewController
(上一个视图控制器)中:

在AddressSearchViewController(用于搜索显示的地址的控制器)中:

然而,无论我做什么——拔下插座,然后重新插入插座,尝试另一个插座,或者在另一个视图控制器和另一个类上尝试代码——当尝试选择一行时,应用程序总是崩溃:我在AddressButton上得到“线程1:致命错误:隐式展开可选值时意外发现零”。我已经测试了这个变量,它在函数setAddressButton中正确显示了添加ViewController的所有方法。唯一似乎不起作用的是AddressButton本身,它在debug区域的变量中显示为
nil


有人知道我做错了什么吗?

为了跟进瓦迪安的comemnt,下面是如何抓住正确的vc实例

let storyboard = UIStoryboard(name: "mystoryboard", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "VCIdentifier")  as! VCType

好问题!在我的脑海里,我有两种方法可以做到这一点。我会向你解释,然后你决定什么对你的申请最好,好吗

但在此之前,请解释您的错误,在这段代码
AddViewController().setAddressButton()
中,您实际上是在创建视图控制器的新实例并调用该函数。您没有使用先前存在的视图控制器

不幸的是,billhack的答案也有同样的错误方法,本质上每次都创建一个新的视图控制器实例

好的,我们开始吧:

首先,我实际测试过: 在第二个视图控制器上创建回调函数,如下所示:

var callBack:((_ buttonTitle: String) -> ())?
在弹出第二个视图控制器之前,请确保将该变量设置为某个值,如下所示:

callBack?("Some Title")
@IBAction func pushToSecondVC(_ sender: Any) {
  if let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewController")as? SecondViewController {
  vc.callBack = { buttonName in
    self.setButtonName(buttonName)
  }
  self.navigationController?.pushViewController(secondVC, animated: true)
}
在第一个视图控制器的推送功能中,编写如下内容:

callBack?("Some Title")
@IBAction func pushToSecondVC(_ sender: Any) {
  if let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewController")as? SecondViewController {
  vc.callBack = { buttonName in
    self.setButtonName(buttonName)
  }
  self.navigationController?.pushViewController(secondVC, animated: true)
}
其次(据我猜测,我实际上还没有尝试过),获取上一个视图控制器并调用函数:

let prev = self.presentingViewController
prev.callTheFunction()

我通过使用Savio建议的回调函数来实现它。我最终调用的回调函数与他所做的略有不同:

在第二个视图控制器上,即弹出并让我搜索地址的视图控制器上,我执行了以下操作:

var callBack: ((_ addressButtonText: String) -> ())?

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let searchResult = searchResults[indexPath.row]
        tableView.deselectRow(at: indexPath, animated: true)
       
        callBack?(searchResult.title)
        
        dismiss(animated: true, completion: nil)
        
       
    }
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "AddViewControllerToAddressSearchViewController" {
            let popup = segue.destination as! AddressSearchViewController
            popup.callBack = setAddressButton(_:)
        }
    }
    
    
    func setAddressButton (_ addressButtonText: String) -> () {
        addressButton.setTitle(addressButtonText, for: .normal)
    }
在第一个视图控制器上,即显示地址搜索视图控制器的视图控制器上,我执行了以下操作:

var callBack: ((_ addressButtonText: String) -> ())?

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let searchResult = searchResults[indexPath.row]
        tableView.deselectRow(at: indexPath, animated: true)
       
        callBack?(searchResult.title)
        
        dismiss(animated: true, completion: nil)
        
       
    }
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "AddViewControllerToAddressSearchViewController" {
            let popup = segue.destination as! AddressSearchViewController
            popup.callBack = setAddressButton(_:)
        }
    }
    
    
    func setAddressButton (_ addressButtonText: String) -> () {
        addressButton.setTitle(addressButtonText, for: .normal)
    }

这段视频确实帮助了我:

AddViewController()
不是您期望的实例。这是一个全新的例子,没有连接的插座,因此崩溃。您需要对情节提要实例的真实引用。请遵守命名约定,以小写字母开头命名函数和变量。能否添加一张图片来描述您需要实现的目标?@vadian在我的案例中,我应该如何引用故事板实例?这取决于控制器的关联方式。通常的方法有segue、脚本实例化、协议/委托和回调闭包……非常感谢!我成功了!我使用了一个回调函数,做了一些与你发布的有点不同的事情(我会发布),但至少我知道我需要做什么。不客气!如果答案有用的话,别忘了给它投票:)。我也期待着看到你的方法