账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    swift 一个控制器实现多个delegate,如何设置指定的delegate
    71
    0

    swift 一个控制器实现多个delegate(UItableviewdelegate,UIScrollViewDelegate),那么tableview.delegate设置指定delegate怎么搞?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 泼辣的小女人 普通会员 1楼

      在Swift中,你可以使用weak关键字和@objc关键字来声明一个UIViewController的多个Delegate。以下是一个示例:

      ```swift class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

      @IBOutlet weak var tableView: UITableView!
      
      var delegate: NSObject?
      
      override func viewDidLoad() {
          super.viewDidLoad()
      
          // 设置Delegate
          delegate = tableView.delegate as? NSObject
      
          // 注册Delegate
          tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
          tableView.dataSource = self
      }
      
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
          // 显示数据
          return delegate?.tableViewData.count ?? 0
      }
      
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          // 使用指定的Delegate获取数据
          let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
      
          // 设置Cell的 delegates
          if let delegate = delegate {
              let data = delegate.tableViewData[indexPath.row]
              cell.textLabel?.text = data.title
              cell.detailTextLabel?.text = data.subtitle
          }
      
          return cell
      }
      
      // 处理Delegate的方法
      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          // 处理选定单元格的事件
          delegate?.tableViewData[indexPath.row] = ["Hello", "World"]
          tableView.reloadData()
      }
      
      // 在代理方法中处理Delegate方法
      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          // 在代理方法中处理选定单元格的事件
          delegate?.tableViewData[indexPath.row] = ["Hello", "World"]
          tableView.reloadData()
      }
      
      // 指定特定的Delegate
      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath, with selected: Bool) {
          // 在特定的Delegate中处理选定单元格的事件
          if let delegate = delegate {
              delegate?.tableViewData[indexPath.row] = selected ? ["Hello", "Selected"] : ["Hello", "World"]
              tableView.reloadData()
          }
      }
      

      } ```

      在这个示例中,我们首先定义了一个MyViewController类,它继承自UIViewController。然后,我们使用weak关键字和@objc关键字声明了一个delegate属性,并将其初始化为tableView的代理。接下来,我们在viewDidLoad方法中设置delegatetableView的代理。然后,我们使用register(_:for:)方法将UITableViewCell注册为MyViewController的代理,这样在每次UITableView的cell数据更改时,MyViewController就会调用tableView(_:cellForRowAt:)方法来获取和设置相应的数据。

      tableView(_:numberOfRowsInSection:)方法中,我们设置delegatetableViewData属性为一个数组,表示每个cell的数据。在这个数组中,我们遍历delegate的代理,并使用selected布尔变量来判断是否选择了选定单元格。

      tableView(_:cellForRowAt:)方法中,我们首先获取delegate的代理,然后根据selected布尔变量来获取相应的数据。我们使用cell.textLabel?.textcell.detailTextLabel?.text方法获取单元格的标题和摘要数据,然后将这些数据设置在Cell的视图上。

      tableView(_:didSelectRowAt:)方法中,我们首先获取delegate的代理,然后根据selected布尔变量来获取选定单元格的数据。在这个方法中,我们首先将selected布尔变量设置为true,表示选中了选定单元格。然后,我们调用delegatetableViewData属性,将选定单元格的数据设置在代理方法中。最后,我们使用reloadData()方法刷新UITableView的数据,以反映实际的选定单元格的更改。

      注意,我们在tableView(_:didSelectRowAt:)方法中使用了selected布尔变量来处理选定单元格的事件,但是这个变量并不是tableViewDelegate。实际上,selected布尔变量只是一个方法参数,用于在特定的Delegate中处理选定单元格的事件。如果你想要在每个UITableView的cell中都处理选定单元格的事件,你可以在didSelectRowAt:)方法中将selected布尔变量设置为true,然后在tableView(_:cellForRowAt:)方法中使用selected布尔变量来获取选定单元格的数据,并将这些数据设置在代理方法中。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部