我试图通过类函数从另一个类执行一个segue。
我有一个名为MyTableViewController
的班级。在那个类中,我构建了一个AnswerViewController
类型的视图控制器。当满足Extension : MyCell
中的条件时,应该发生到该视图控制器的segue。我遇到的问题是函数showNextView
没有被调用。
我已阅读Perform Segue From Another Swift File via a class function和Perform Segue from another class with helper function上的帖子,但这两个帖子在构建视图控制器之前创建了一个segue (我不能这样做,因为我没有使用故事板,实际上没有segues,只有pushViewController
)。
class MyTableViewController: UITableViewController {
//Construct View Controller
let answerViewController = AnswerViewController()
//Create goToNextView function which will be called in extension MyCell
func goToNextView(){
navigationController?.pushViewController(answerViewController, animated: true)
}
}
extension MyCell: YSSegmentedControlDelegate{
func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) {
tagToIndex[actionButton.tag] = index
print(tagToIndex)
//Condition To Be Met
if tagToIndex == [0:1,1:0,2:1]{
//Access function goToNextView from MyTableViewController
func showNextView(fromViewController : MyTableViewController){
fromViewController.goToNextView()
}
}
}
}
如何调用showNextView
函数以便发生segue?
谢谢, 尼克
答案 0 :(得分:1)
你不能这样做。您的showNextView
函数嵌套在segmentedControl(_, willPressItemAt)
中 - 这意味着它无法在其外部访问。您通常不应使用嵌套函数。
要解决您的问题,您应该为您的单元格创建一个委托,并通知您的视图控制器已发生某个操作。
一个简单的例子:
protocol MyCellDelegate: class {
func myCellRequestedToOpenAnswerVC(cell: MyCell)
}
class MyCell {
weak var delegate: MyCellDelegate?
// rest of your inplementation
}
然后,将segmentedControl(_, willPressItemAt)
更改为:
func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt index: Int) {
tagToIndex[actionButton.tag] = index
print(tagToIndex)
//Condition To Be Met
if tagToIndex == [0:1,1:0,2:1]{
self.delegate?.myCellRequestedToOpenAnswerVC(cell: self)
}
}
最后一部分发生在MyTableViewController
中 - 首先,在您的cellForRow
方法中将视图控制器指定为委托,类似这样 - cell.delegate = self
,并使视图控制器符合{{ 1}}:
MyCellDelegate
现在,只要满足条件,您的视图控制器就会得到相关信息,并能够采取相应的行动。
如果您不熟悉协议和委派模式,我强烈推荐reading through the docs,因为它在CocoaTouch中广泛使用。