通过没有故事板的功能从另一个类执行瞄准

时间:2017-07-21 14:16:05

标签: ios uitableview uiviewcontroller segue

我试图通过类函数从另一个类执行一个segue。

我有一个名为MyTableViewController的班级。在那个类中,我构建了一个AnswerViewController类型的视图控制器。当满足Extension : MyCell中的条件时,应该发生到该视图控制器的segue。我遇到的问题是函数showNextView没有被调用。

我已阅读Perform Segue From Another Swift File via a class functionPerform 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?

谢谢, 尼克

1 个答案:

答案 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中广泛使用。