从 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)
}
我有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)
}