Swift 代理函数无返回值,didSelectRowAt中delegate为nil问题求助
问题根因
你通过Storyboard Segue触发跳转时,系统会自动创建一个全新的FontTableTableViewController(VC-B)实例,而你在VC-A中手动初始化的fontTable实例和跳转使用的实例是两个完全独立的对象,你仅给手动创建的实例设置了delegate,跳转时用到的VC-B实例的delegate未被赋值,因此为nil导致传值失效。
修复方案
- 第一步:删除VC-A中无效的手动初始化逻辑,清理后VC-A代码如下:
class ViewController: UIViewController, FontDelegate { @IBOutlet weak var infoLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() } func getFontName(data: String) { infoLabel.text = data } }
- 第二步:在VC-A中重写
prepare(for:sender:)方法,在Segue触发时拿到跳转目标VC-B实例,为其设置delegate。首先你需要先在Storyboard中给当前的Popover Segue设置唯一标识(比如命名为fontSelectSegue),然后添加如下代码:
// 追加到ViewController类中 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 这里替换为你自己在Storyboard中设置的Segue标识 if segue.identifier == "fontSelectSegue" { guard let fontTableVC = segue.destination as? FontTableTableViewController else { return } fontTableVC.delegate = self } }
- 第三步(可选优化):为避免循环引用风险,给协议添加类约束,并将代理属性修饰为weak,修改VC-B代码如下:
// 协议添加AnyObject约束,表示仅允许类遵守 protocol FontDelegate: AnyObject { func getFontName(data: String) } class FontTableTableViewController: UITableViewController { let fontArray = ["Helvetica", "Arial", "Monaco"] // 代理属性加weak修饰 weak var delegate: FontDelegate? // 其余原有代码保持不变 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let font = fontArray[indexPath.row] self.delegate?.getFontName(data: font) self.dismiss(animated: true, completion: nil) } }
内容的提问来源于stack exchange,提问作者squarehippo10
相关产品推荐
相关产品推荐

