【问题标题】:Protocol and Delegate model function is called, but does not run协议和委托模型函数被调用,但不运行
【发布时间】:2021-03-02 20:24:37
【问题描述】:

您好,当委托在另一个视图控制器中调用时,我在运行函数时遇到了一些问题。我有两个视图控制器。目标是,当其中一个视图控制器关闭时,它会调用一个函数。

这是第一个视图控制器的代码。调试领事中的“A”和“B”打印。

protocol UpdateApproachProtocol {
    func addApproachToEntry()
}

class ApproachViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {
    
    var delegate: UpdateApproachProtocol?
   
    override func viewDidLoad() {
        
        super.viewDidLoad()
        title = "Add an Approach"
        tableView.delegate = self
        tableView.dataSource = self
        
        safeArea = view.layoutMarginsGuide
        setupView()
        
       
    }
    override func viewDidDisappear(_ animated: Bool) {
        LoadData.shared.approachArray.append(newApproach)
        print("A")
        delegate?.addApproachToEntry()
        print("B")
    }
   
}

这是另一个视图控制器的代码……“测试”永远不会被打印出来。我错过了什么?

class AddEntryViewController: KeyboardViewController, SendTailToEntryProtocol  {
    
override func viewDidLoad() {

        super.viewDidLoad()
        let approachVC = ApproachViewController()
        approachVC.delegate = self
}
extension AddEntryViewController: UpdateApproachProtocol {
    func addApproachToEntry() {
        print("test")
       
    }
}
}

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      
        if indexPath.section == 5 && indexPath.row == 0 {
            
            self.navigationController?.showDetailViewController(ApproachViewController(), sender: nil)
           
        }
    }
}

【问题讨论】:

  • Om viewDidLoad 在您的第二个代码示例中,您创建了一个ApproachViewController,然后从不对其进行任何操作——它立即超出了范围。您是否想向我们展示一些代码?或者这实际上不是正在显示的 ApproachViewController 实例?
  • 您能否详细说明ApproachViewController 超出范围的情况?我称之为这个的唯一原因是将委托设置为等于视图控制器。缺少一些代码,主要是为我的 UIPickerView 格式化。
  • 是的——你创建了视图控制器,然后你什么也不用做。它永远不会出现在屏幕上。您在其上设置了委托,但这无关紧要,因为用户从不与视图控制器的 该实例 进行交互。我假设您已经在其他地方展示了该视图控制器(您没有向我们展示该代码)并且您真正想要的是将实际显示给用户的实例设置为委托。但是,同样,您没有显示足够的代码来说明应该如何发生。
  • 不要在 cmets 中发布代码(这真的很难阅读),请编辑您的原始问题。显示ApproachViewController 的创建位置和AddEntryViewController 的创建位置
  • 已更新。在AddEntryViewController 上,您可以看到ApproachViewController 何时出现在屏幕上。以及如何关闭并带回AddEntryViewController

标签: ios swift function delegates protocols


【解决方案1】:

在您创建 ApproachViewController 的代码中:

let approachVC = ApproachViewController()
approachVC.delegate = self
self.navigationController?.showDetailViewController(approachVC, sender: nil)

然后,从viewDidLoad 中删除它,因为它只是创建ApproachViewController 并且对它没有任何作用:

let approachVC = ApproachViewController()
approachVC.delegate = self

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    相关资源
    最近更新 更多