如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?
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 在 viewWillAppear 上重新加载 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 像素