如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?

Posted

技术标签:

【中文标题】如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?【英文标题】:How to add values to array dynamically if you move from one view controller to another viewcontroller in swift? 【发布时间】:2020-06-06 06:09:19 【问题描述】:

Add_EditAddressViewController 中,我需要在tableview 中显示所有添加的地址,为此我创建了一个ARRAY 并将值附加到NewZoomAddressViewController 中的数组以显示在tableview 中,但我一直在tableview 中获得单行。 . 那么这里如何在 Add_EditAddressViewController 中动态地向数组添加值而不替换成 oldvalue

导航是:

Add_EditAddressViewController: butnTap -> ProfileVC: btnTap -> NewZoomAddressViewController: btnTap -> Add_EditAddressViewController

这里每次当我来到NewZoomAddressViewController 需要将\(self.sublocalityName!) \(localityName!) \(self.zipName!) 附加到addressArray 以显示在Add_EditAddressViewController 的tableview 中

注意:这里我在 github 中添加了这个问题相关代码:https://github.com/SwiftSamples/AddressBug 在 profileVC 中,您需要点击地图或继续按钮,然后导航到 NewZoomAddressViewController

class Add_EditAddressViewController: UIViewController,DataEnteredDelegate 
@IBOutlet weak var addeditTableview: UITableView!
var addressArray = [String]()

var city: String?
var pincode: String?
var locality: String?

override func viewDidLoad() 
    super.viewDidLoad()
    addeditTableview.register(UINib(nibName: "EditAddressTableViewCell", bundle: nil), forCellReuseIdentifier: "EditAddressTableViewCell")
    print("zoooom valuew \(pincode)")
    addeditTableview.reloadData()



extension Add_EditAddressViewController : UITableViewDelegate,UITableViewDataSource 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return addressArray.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell: EditAddressTableViewCell = tableView.dequeueReusableCell(withIdentifier: "EditAddressTableViewCell") as! EditAddressTableViewCell

    cell.editButton.addTarget(self, action: #selector(editbuttonClicked(sender:)), for: .touchUpInside)

        cell.nameHeader.text = "header"
        cell.addressLabel.text = addressArray[indexPath.row]

    return cell


NewZoomAddressViewController 代码:

class NewZoomAddressViewController: UIViewController 
weak var delegate: DataEnteredDelegate? = nil
var addressModel: ProfileModelUserAddress?
var addressArray = [String]()

var zipName: String?
var localityName: String?
var sublocalityName: String?

@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var addressLabel: UILabel!

override func viewDidLoad() 
    super.viewDidLoad()
    print("in Zoom map VC")
    mapView.delegate = self
    addressLabel.text = "\(self.sublocalityName!) \(localityName!) \(self.zipName!)"



@IBAction func confirmBtn(_ sender: Any) 
    let viewController = storyboard?.instantiateViewController(withIdentifier: "Add_EditAddressViewController") as! Add_EditAddressViewController
    addressArray.append("\(sublocalityName ?? "") \(zipName ?? "") \(localityName ?? "")")
    viewController.addressArray = addressArray

    print("total address array all rows \(viewController.addressArray)")
    navigationController?.pushViewController(viewController, animated: true)



请尝试帮助在表格视图中显示所有添加的地址。我卡在这里很久了。

【问题讨论】:

如何通过返回按钮从Add_EditAddressViewController 转到NewZoomAddressViewController?或者你写一些代码? @jawadAli Add_EditAddressViewController profileViewcontroller 从这里到 NewZoomAddressViewController 使用按钮 pushviewcontroller 所以你每次都启动新的NewZoomAddressViewController .... 这就是为什么每次都会启动数组 @jawadAli,正确然后我如何将所有值获取到表格视图.. 如果我做错了.. 引导我正确的方式 @jawadAli 请尝试将答案每次附加到addressArray 【参考方案1】:

在您的 NewZoomAddressViewController 中,将确认按钮操作替换为

@IBAction func confirmBtn(_ sender: Any) 

    for controller in navigationController?.viewControllers ?? [] 
        if let listController =  controller as? Add_EditAddressViewController 
            let string = "\(sublocalityName ?? "") \(zipName ?? "") \(localityName ?? "")"
            listController.addressArray.append(string)
            navigationController?.popToViewController(controller, animated: true)
            return
        
    

Add_EditAddressViewController 在 vi​​ewWillAppear 上重新加载 TableView

override func viewWillAppear(_ animated: Bool) 
    self.navigationController?.navigationBar.isHidden=true
    addeditTableview.reloadData()

【讨论】:

我需要将相同的addressArray 发送到两个视图控制器 Add_EditAddressViewController 和配置文件视图控制器如何请告诉我 在这些 String 类型的控制器中创建一个变量,即var array: [String] = [] 当您初始化 Add_EditAddressViewControlle 和 ProfileViewController 的对象时,从您当前的 VC 中只需在推送到导航之前传递此数组。 我无法将添加的数组保存在Add_EditAddressViewController 中,我将在 github 中分享代码,请您也解决问题 我正在谈论这个问题.. 我会将您的问题标记为正确答案***.com/questions/62259218/…【参考方案2】:

那么您需要做的是在您的配置文件视图中拥有地址数组,并将其传递给其他控制器.. 这样您的代码就变成了

首先,您将在配置文件中拥有这样的数组

class ProfileAddressViewController: UIViewController, CLLocationManagerDelegate, UISearchBarDelegate, DataEnteredDelegate 
   var addressArray = [String]()

然后,当您调用 NewZoomAddressViewController 时,您会像这样将该数组传递给他们

@objc func triggerTouchAction(_ sender: UITapGestureRecognizer) 
        print("Please Help!")

        let viewController = self.storyboard?.instantiateViewController(withIdentifier: "NewZoomAddressViewController") as! NewZoomAddressViewController
            viewController.delegate = self

        viewController.zipName = self.pincodeField.text
        viewController.sublocalityName = self.colonyField.text
        viewController.localityName = self.cityField.text
        viewController.addressArray = addressArray
            self.navigationController?.pushViewController(viewController, animated: true);
    

在您调用配置文件的Add_EditAddressViewController 中.. 将数组分配给配置文件

@objc func editbuttonClicked(sender: UIButton) 
        print("in button")
         let viewController = self.storyboard?.instantiateViewController(withIdentifier: "ProfileAddressViewController") as! ProfileAddressViewController
        viewController.addressArray = addressArray
        self.navigationController?.pushViewController(viewController, animated: true)
    

【讨论】:

谢谢,这里也有新值在 tableview 中替换

以上是关于如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用 swift 5 的动态集合视图从一个视图控制器移动到另一个视图控制器?

快速将图像从一个视图控制器传递到另一个视图控制器

当从一个视图控制器传递到另一个视图时,视图向上移动 x 像素

将图像从集合视图控制器快速传递到另一个视图控制器

如何使用 swift 在情节提要中从一个视图控制器移动到另一个视图控制器 [重复]

将数据移动到另一个视图控制器,但第二个视图控制器在第一个视图控制器之前加载