当前位置: 首页 > 知识库问答 >
问题:

将数据从表单元格发送到视图控制器时,委托属性为nill

公孙霖
2023-03-14

委派模式有一个问题,我试图将数据从一个表视图单元格发送到另一个视图控制器,但当我在第二个控制器(接收器)内设置delegate属性时,它是零,有人能给我解释一下吗,我对此是新手

协议和发送者类:

import UIKit

protocol SendDataDelegate {
    func updateProperties(_ data: CellData)
}

class ViewController: UIViewController {
        
    @IBOutlet weak var tableView: UITableView!
        
    var arr: [CellData] = [
        CellData(img: UIImage(named: "1")!, str1: "welcome1", str2: "hello1"),
        CellData(img: UIImage(named: "2")!, str1: "welcome2", str2: "hello2"),
        CellData(img: UIImage(named: "3")!, str1: "welcome3", str2: "hello3"),
        CellData(img: UIImage(named: "4")!, str1: "welcome4", str2: "hello4"),
        CellData(img: UIImage(named: "5")!, str1: "welcome5", str2: "hello5"),
        CellData(img: UIImage(named: "6")!, str1: "welcome6", str2: "hello6"),
        CellData(img: UIImage(named: "7")!, str1: "welcome7", str2: "hello7"),
        CellData(img: UIImage(named: "8")!, str1: "welcome8", str2: "hello8"),
        CellData(img: UIImage(named: "9")!, str1: "welcome9", str2: "hello9"),
        CellData(img: UIImage(named: "10")!, str1: "welcome10", str2: "hello10")
    ]
    
    var delegate: SendDataDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }
        
    fileprivate func setupTableView() {
        tableView.dataSource = self
        tableView.delegate   = self
        tableView.register(
            UINib(nibName: Constants.cellNibName, bundle: nil),
            forCellReuseIdentifier: Constants.cellIdentifier
        )
    }
}

extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arr.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(
            withIdentifier: Constants.cellIdentifier,
            for: indexPath
        ) as! TableCell
        cell.picture.image = arr[indexPath.row].img
        cell.label1.text   = arr[indexPath.row].str1
        cell.label2.text   = arr[indexPath.row].str2
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return CGFloat(300.0)
    }
}

extension ViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        
        let storyboard = UIStoryboard(name: Constants.storyboardName, bundle: nil)
        let nextController = storyboard.instantiateViewController(
            withIdentifier: Constants.destinationController
        ) as! SecondController
        
        var data = arr[indexPath.row]
        delegate?.updateProperties(data)
        present(nextController, animated: true, completion: nil)
    }
    
}

下面是receiver类:

import UIKit

class SecondController: UIViewController {
        
    @IBOutlet weak var picture: UIImageView! {
        didSet {
            picture.image = img
        }
    }
    @IBOutlet weak var label11: UILabel! {
        didSet {
            label11.text = s1
        }
    }
    @IBOutlet weak var label22: UILabel! {
        didSet {
            label22.text = s2
        }
    }

    var s1 = ""
    var s2 = ""
    var img = UIImage()
        
    override func viewDidLoad() {
        super.viewDidLoad()
    
        view.backgroundColor = .systemRed
        
        let controller = UIStoryboard(name: Constants.storyboardName, bundle: nil).instantiateViewController(
        withIdentifier: Constants.firstController
        ) as! ViewController
        controller.delegate = self
        print(s1)
    }
    
}

extension SecondController: SendDataDelegate {
    
    func updateProperties(_ data: CellData) {
        self.s1 = data.str1
        self.s2 = data.str2
        self.img = data.img
    }
    
}

共有1个答案

袁泰平
2023-03-14

这里不需要委托您只需要传递模型

nextController.sendedItem = arr[indexPath.row]

secondcontroller内部

var sendedItem:CellData?

内部的viewdidload设置值

编辑:

nextController.updateProperties(data)
present(nextController, animated: true, completion: nil)
 类似资料:
  • 我的视图中有一个向控制器发送对象的表单,但问题是,如果我发送的对象超过256个,就会出现异常: 所以我在想为什么会有这样的限制,于是我找到了这个话题:https://stackoverflow.com/a/24699008/4173394 但它似乎对我不起作用(可能是我的一个坏习惯)。 下面是我的结构:我的视图名为createUpdate.vm,并像这样发布我的表单: 我在FollowerFile

  • 问题内容: 我必须将数据从html页面(带有很少输入文本字段的简单形式)发送到页面控制器,然后再发送到数据库。我正在使用3.0版的百里香2.0.17。我搜索并检查了一些解决方案,但是没有用。也许有人遇到了同样的问题,并找到了一些好的解决方案。请帮忙。谢谢 问题答案: 如本教程所建议,你需要使用,并在中创建一个表单。 看起来像这样: 控制器: HTML: Foo.java: 希望这可以帮助。

  • 在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图。控制器类将响应请求来的URL。控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果会发送回浏览器。视图模板可以被控制器用来产生格式化过的HTML从而返回给浏览器。 控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML。最佳做法是:一

  • 我是百里香菜鸟。我试图创建一个简单的crud应用程序。我试图在删除按钮上删除客户类的对象。我如何使用百里香叶为调用deleteUser的方法设置参数(例如- id)。这是我的控制器。 以下是我的看法。

  • seleccion“对象它是一个实体,具有我从Ajax发送的JSON的一些属性,”seleccionados“是一个列表,保存接收到的数组,但当我发送它时,obj参数总是返回一个空对象,Ajax发送错误函数,我认为问题是我在向对象发送数组,但我不知道如何解决它 选择对象模型:

  • 问题内容: 我是laravel的新手,我一直试图将表’student’的所有记录存储到一个变量,然后将该变量传递给视图,以便可以显示它们。 我有一个控制器-ProfileController,里面有一个函数: 我认为我有此代码 我收到此错误:未定义的变量:学生(View:regprofile.blade.php) 问题答案: 你能试试看吗 同时,您可以设置多个类似这样的变量,