如何在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 项目的不同导航堆栈中从一个视图控制器屏幕切换到另一个?

在swift 3中将json id从一个表视图控制器传递到另一个表视图控制器

如何在swift中从文档目录中获取特定文件的NSURL