如何在swift 3中从一个视图控制器传递到上一个视图控制器时设置委托?
Posted
技术标签:
【中文标题】如何在swift 3中从一个视图控制器传递到上一个视图控制器时设置委托?【英文标题】:how to set delegate while passing from one view controller to previous in swift 3? 【发布时间】:2017-09-08 05:07:46 【问题描述】:这里我试图将选定的数据从表视图传递到前一个视图控制器,但无法做到这一点,下面提到了代码以及在这种情况下在哪里设置委托,谁能帮我解决这个问题?
protocol ArrayToPass: class
func selectedArrayToPass(selectedStrings: [String])
class FilterSelectionViewController: UIViewController,UITableViewDataSource,UITableViewDelegate
var values = [String]()
var delegate: ArrayToPass?
override func viewDidLoad()
super.viewDidLoad()
self.downloadJsonWithURL()
tableDetails.separatorInset = UIEdgeInsets.zero
activityIndicator.startAnimating()
tableDetails.isHidden = true
tableDetails.dataSource = self
tableDetails.delegate = self
let rightBarButton = UIBarButtonItem(title: "Apply", style: UIBarButtonItemStyle.plain, target: self, action: #selector(applyBarButtonActionTapped(_:)))
self.navigationItem.rightBarButtonItem = rightBarButton
tableDetails.estimatedRowHeight = UITableViewAutomaticDimension
tableDetails.rowHeight = 60
// Do any additional setup after loading the view.
func applyBarButtonActionTapped(_ sender:UIBarButtonItem!)
let vc = FilterSelectionViewController()
vc.delegate = self as! ArrayToPass
navigationController?.popViewController(animated: true)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
selected = false
if let cell = tableView.cellForRow(at: indexPath as IndexPath)
if cell.accessoryType == .checkmark
cell.accessoryType = .none
print("\(productName[indexPath.row])")
values = values.filter$0 != "\(productName[indexPath.row])"
selected = true
else
cell.accessoryType = .checkmark
if selected == true
print(values)
else
getAllTextFromTableView()
self.delegate?.selectedArrayToPass(selectedStrings: values)
print(values)
func getAllTextFromTableView()
guard let indexPaths = self.tableDetails.indexPathsForSelectedRows else // if no selected cells just return
return
for indexPath in indexPaths
values.append(productName[indexPath.row])
在这个视图控制器中我试图获取数据
class FilterViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,ArrayToPass
var values: [String] = []
func selectedArrayToPass(selectedStrings: [String])
values = selectedStrings
【问题讨论】:
在FilterViewController
中,您是否将 FilterSelectionViewController
的委托分配给 self ? , 显示你的显示方式FilterSelectionViewController
没有在哪里设置? @MikeAlter
那;这就是为什么在您显示 FilterSelectionViewController 的位置显示代码
@MikeAlter 在哪里设置委托我已经发布了代码
看我的回答我已经为你添加了例子
【参考方案1】:
在推送或呈现 viewController 之前 (FilterSelectionViewController
)
您需要将delegate
分配给self
或任何NSObject
类,否则委托将不会调用
这里是例子
@IBAction func btnNextTapped(_ sender: UIButton)
let vc: FilterSelectionViewController = // Assign VC
vc.delegate = self //MISSING PART
// PUSH OR PRESENT VC
【讨论】:
【参考方案2】:在进入第二视图之前你需要确认协议
class FilterViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,ArrayToPass
var values: [String] = []
func actionGotoFilterSection()
// class initilization with navigation
let filterSection = self.storyBoard.instantiateViewController(withIdentifier: "filterSectionIdentifier") as! FilterSelectionViewController
filterSection.delegate = self
self.navigationController?.pushViewController(filterSection, animated: true)
//MARK: - Delegate Methods
func selectedArrayToPass(selectedStrings: [String])
values = selectedStrings
为了更好地理解visit this link.
【讨论】:
这是protocol
的过程,而不是我所做的您理解的实际答案。 @VamsiKrishnaS【参考方案3】:
在 FilterSelectionViewController 中重定向时,您必须像这样设置 delegate = self
let main = UIStoryboard(name: "Main", bundle: nil)
let vc = main.instantiateViewController(withIdentifier: "tempVC") as! tempVC// Your FilterSelectionViewController
vc.delegateColor = self //your delegate
navigationController?.pushViewController(vc, animated: true)
【讨论】:
我需要在之前的视图控制器中设置委托?@NishantBhindi 是的,在你去你的 FilterSelectionViewController 之前以上是关于如何在swift 3中从一个视图控制器传递到上一个视图控制器时设置委托?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 swift 在情节提要中从一个视图控制器移动到另一个视图控制器 [重复]
如何通过单击按钮在 Swift UI 中从一个视图导航到另一个视图
如何在 swift 中从情节提要中的 didSelectRowAt indexPath 打开视图标签栏控制器?
如何在我的 Xcode Swift 项目的不同导航堆栈中从一个视图控制器屏幕切换到另一个?