从 UIView 执行 segue

perform segue from UIView

我有ViewController,里面有UIView。

此 UIView 有单独的 class myView,并且有许多 UI 元素 - 其中之一是 CollectionView。

我想要的是当 myView 中的一个集合元素被选中时执行 segue。但是当我尝试添加行

performSegue(withIdentifier: "myIdintifier", sender: self)

到集合的视图 didSelectItemAt 方法我得到错误

Use of unresolved identifier 'performSegue'

而且我知道这是因为我在扩展 UIView 而不是 UIViewController 的 class 中执行此操作。

那么在这种情况下我该如何执行segue呢?还有我如何为 segue 做准备?

可以使用protocols/delegates.

实现
 // At your CustomView

protocol CustomViewProtocol {
    // protocol definition goes here
    func didClickBtn()
}


 var delegate:CustomViewProtocol




@IBAction func buttonClick(sender: UIButton) {
    delegate.didClickBtn() 
  }




//At your target Controller
public class YourViewController: UIViewController,CustomViewProtocol

let customView = CustomView()
customView.delegate = self

func didClickSubmit() {
     // Perform your segue here
}

下面我就一步一步来评价一下。

步骤 - 1

使用协议创建自定义委托,如下代码片段将指导您创建自定义 UIView。 protocol 必须存在于您的自定义视图范围之外。

protocol CellTapped: class {
    /// Method
    func cellGotTapped(indexOfCell: Int) 
}

不要忘记在您的自定义视图

上创建上述 class 的委托变量,如下所示
var delegate: CellTapped!

使用你的集合视图 didSelect 方法如下

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if(delegate != nil) {
            self.delegate.cellGotTapped(indexOfCell: indexPath.item)
        }
    }

步骤 - 2

让我们来看看您的视图控制器。把 CellTapped 给你的 viewcontroller.

class ViewController: UIViewController,CellTapped {

    @IBOutlet weak var myView: MyUIView! //Here is your custom view outlet
    override func viewDidLoad() {
        super.viewDidLoad()
        myView.delegate = self  //Assign delegate to self
    }

    // Here you will get the event while you tapped the cell. inside it you can perform your performSegue method.
    func cellGotTapped(indexOfCell: Int) {
        print("Tapped cell is \(indexOfCell)")
    }
}

希望对您有所帮助。

除了定义协议,你还可以使用Notification。 一、extent nonfiction.name:

extension Notification.Name {
    static let yourNotificationName = Notification.Name(“yourNotificationName”)
}

然后在你想要执行 segue 但不能在你的自定义 UIView 中执行的地方:

NotificationCenter.default.post(name: .yourNotificationName, object: self)

最后,您可以在 viewControllers 中收听通知:

private var observer: NSObjectProtocol?
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    observer = NotificationCenter.default.addObserver(forName: .yourNotificationName, object: nil, queue: nil) {notification in
    self.performSegue(withIdentifier:”your segue”, sender: notification.object}

别忘了删除它:

override func viewWillDisappear(_ animated: Bool){
    super.viewWillDisappear(animated)
  NotificationCenter.default.removeObserver(observer)

}