swift : How to instantiate a new view controller with separate delegate

标签 swift uitableview delegates viewcontroller

所以我有一个关于当我单击 tableviewcell 时实例化新 vc 的问题。由于我已将委托(delegate)和数据源分离到单独的类中,因此我不再从 ViewController 继承。除了从委托(delegate)类创建新 VC 之外,我还有哪些选择?另一个潜在的问题是我的显示数组是在另一个单独的 myDataSource 类中创建的。我如何将其传递给 MyDelegate 类?

class ViewController: UITableViewController {
        let aDataSource = MyDataSource()
        let aDelegate = MyDelegate()

      override func viewDidLoad() {
            super.viewDidLoad()
            tableView.dataSource = aDataSource
            tableView.delegate = aDelegate
      }
    }


class MyDelegate: NSObject, UITableViewDelegate {


        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            // i want to do the following but it doesn't work since i'm not inheriting from viewcontroller i guess. 

          guard let vc = storyboard?.instantiateViewController(withIdentifier: "detailedShowViewController") as? DetailedShowViewController else {
                fatalError("Unable to instantiate view controller.")
            }

            let item = shows[indexPath.row]
            vc.show = item

            navigationController?.pushViewController(vc, animated: true)
        }
    }

最佳答案

您可以创建一个委托(delegate)并让您的 View Controller 继承此委托(delegate)来处理回调:

protocol MyViewControllerDelegate {
    func didSelectItemAt(_ indexPath: IndexPath)
}

MyDelegate 类中创建一个新属性,例如 weak var myVCDelegate: MyViewControllerDelegate?

让您的 View Controller 继承它并将其自身分配给来自 MyDelegate 的委托(delegate)(或将其注入(inject)到类中)

// In ViewController

aDelegate.myVCDelegate = self


// In MyDelegate class

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   // Do some stuff

   // Pass the position of the item.
   myVCDelegate?.didSelectItemAt(indexPath)
}

因此,当您选择一个单元格时,只需调用该函数将indexPath传递给 View Controller ,然后您就可以通过indexPath从数据源获取该项目。

关于 swift : How to instantiate a new view controller with separate delegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57548211/

相关文章:

arrays - 使用 Enum 类型保存字典数组,NSCoding

swift - 一些数字疯狂

ios - 如何让plist中的特定项目显示在tableView中

macos - NSResponder 在 acceptsFirstResponder 为 false 时接受事件?

ios - Swift 3 将 JSON 数据排序/分组到带有部分的 TableView 中

ios - UITableView:突出显示最后一个单元格,但其他单元格也会突出显示

ios - 在 Xcode 中左对齐部分文本,右对齐部分文本

java - 如何调用传递的方法?这就是委托(delegate)吧?

objective-c - 如何处理自定义 UIViewController 委托(delegate) (ARC)?

c# - 将泛型方法作为参数传递给另一个方法