Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 获取嵌入在UITableViewCell中的UITable单元格的indexPath_Ios_Swift_Uitableview - Fatal编程技术网

Ios 获取嵌入在UITableViewCell中的UITable单元格的indexPath

Ios 获取嵌入在UITableViewCell中的UITable单元格的indexPath,ios,swift,uitableview,Ios,Swift,Uitableview,下面是TableView的结构: 有一个主UITableView,在每个UITableView单元格中有另一个UITableView 截图: 每个UITableViewCells都被设计为自定义视图,并通过在cellForRowAtIndexPath函数中从Nib加载来添加 我要做的是,对于在内部表视图中选择的任何选项,我要获取嵌入表视图的单元格的索引路径 文件布局: 我试图遵循Paulw11所提到的代表方法: 注意:Paulw11建议的方法非常有效 代码(TableVC): class

下面是TableView的结构: 有一个主UITableView,在每个UITableView单元格中有另一个UITableView

截图:

每个UITableViewCells都被设计为自定义视图,并通过在cellForRowAtIndexPath函数中从Nib加载来添加

我要做的是,对于在内部表视图中选择的任何选项,我要获取嵌入表视图的单元格的索引路径

文件布局:

我试图遵循Paulw11所提到的代表方法:

注意:Paulw11建议的方法非常有效

代码(TableVC):

class TableVC: UITableViewController, QuestionCellDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 5
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return 220.0
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("QuestionCell", owner: self, options: nil)?.first as! QuestionCell

    cell.delegate = self

    return cell
}

func sendCellInfo(cell: UITableViewCell) {

    print(cell)

    let indexPathForQuestion = tableView.indexPath(for: cell)

    print(indexPathForQuestion)
}}
protocol QuestionCellDelegate: class {

func sendCellInfo(cell: UITableViewCell)
}


class QuestionCell: UITableViewCell, UITableViewDelegate,      UITableViewDataSource{

@IBOutlet weak var optionsTableview: UITableView!

var delegate: QuestionCellDelegate?

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    self.optionsTableview.delegate = self
    self.optionsTableview.dataSource = self
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("OptionsCell", owner: self, options: nil)?.first as! OptionsCell

    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 4
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedCell = optionsTableview.cellForRow(at: indexPath)

    print("selectedCell")

        self.delegate?.sendCellInfo(cell: selectedCell!)
}}
class OptionsCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}}
 func sendCellInfo(cell: UITableViewCell) {

    /*** Take the cell passed and convert to a CGPoint wrt to TableView ***/
    let cellPosition: CGPoint = cell.convert(cell.bounds.origin, to: self.tableView)

     /*** wrt to CGPoint find index on current TableView ***/
    /*** Returns as Section,Cell ***/
    let indexPathForSelectedCell = (tableView.indexPathForRow(at: cellPosition)?.row)

    print(indexPathForSelectedCell)
}
代码(问题单元格):

class TableVC: UITableViewController, QuestionCellDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 5
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return 220.0
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("QuestionCell", owner: self, options: nil)?.first as! QuestionCell

    cell.delegate = self

    return cell
}

func sendCellInfo(cell: UITableViewCell) {

    print(cell)

    let indexPathForQuestion = tableView.indexPath(for: cell)

    print(indexPathForQuestion)
}}
protocol QuestionCellDelegate: class {

func sendCellInfo(cell: UITableViewCell)
}


class QuestionCell: UITableViewCell, UITableViewDelegate,      UITableViewDataSource{

@IBOutlet weak var optionsTableview: UITableView!

var delegate: QuestionCellDelegate?

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    self.optionsTableview.delegate = self
    self.optionsTableview.dataSource = self
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("OptionsCell", owner: self, options: nil)?.first as! OptionsCell

    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 4
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedCell = optionsTableview.cellForRow(at: indexPath)

    print("selectedCell")

        self.delegate?.sendCellInfo(cell: selectedCell!)
}}
class OptionsCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}}
 func sendCellInfo(cell: UITableViewCell) {

    /*** Take the cell passed and convert to a CGPoint wrt to TableView ***/
    let cellPosition: CGPoint = cell.convert(cell.bounds.origin, to: self.tableView)

     /*** wrt to CGPoint find index on current TableView ***/
    /*** Returns as Section,Cell ***/
    let indexPathForSelectedCell = (tableView.indexPathForRow(at: cellPosition)?.row)

    print(indexPathForSelectedCell)
}
代码(选项单元格):

class TableVC: UITableViewController, QuestionCellDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 5
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return 220.0
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("QuestionCell", owner: self, options: nil)?.first as! QuestionCell

    cell.delegate = self

    return cell
}

func sendCellInfo(cell: UITableViewCell) {

    print(cell)

    let indexPathForQuestion = tableView.indexPath(for: cell)

    print(indexPathForQuestion)
}}
protocol QuestionCellDelegate: class {

func sendCellInfo(cell: UITableViewCell)
}


class QuestionCell: UITableViewCell, UITableViewDelegate,      UITableViewDataSource{

@IBOutlet weak var optionsTableview: UITableView!

var delegate: QuestionCellDelegate?

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    self.optionsTableview.delegate = self
    self.optionsTableview.dataSource = self
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("OptionsCell", owner: self, options: nil)?.first as! OptionsCell

    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 4
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedCell = optionsTableview.cellForRow(at: indexPath)

    print("selectedCell")

        self.delegate?.sendCellInfo(cell: selectedCell!)
}}
class OptionsCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}}
 func sendCellInfo(cell: UITableViewCell) {

    /*** Take the cell passed and convert to a CGPoint wrt to TableView ***/
    let cellPosition: CGPoint = cell.convert(cell.bounds.origin, to: self.tableView)

     /*** wrt to CGPoint find index on current TableView ***/
    /*** Returns as Section,Cell ***/
    let indexPathForSelectedCell = (tableView.indexPathForRow(at: cellPosition)?.row)

    print(indexPathForSelectedCell)
}
注意:当前O/p为nil

注意:根据pbasdf的注释更改了代码,意识到了错误

使用以下命令:

tableView.CellForRowatineXpath(YourIndexPath)为!OptionCell

您可以将自己的indexPath作为全局变量,并将其归档到didSelectRow方法中


YourIndexPath=indexPath

找到了解决方案,原因是pbasdf注释:

表VC中的委托函数:

class TableVC: UITableViewController, QuestionCellDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 5
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return 220.0
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("QuestionCell", owner: self, options: nil)?.first as! QuestionCell

    cell.delegate = self

    return cell
}

func sendCellInfo(cell: UITableViewCell) {

    print(cell)

    let indexPathForQuestion = tableView.indexPath(for: cell)

    print(indexPathForQuestion)
}}
protocol QuestionCellDelegate: class {

func sendCellInfo(cell: UITableViewCell)
}


class QuestionCell: UITableViewCell, UITableViewDelegate,      UITableViewDataSource{

@IBOutlet weak var optionsTableview: UITableView!

var delegate: QuestionCellDelegate?

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    self.optionsTableview.delegate = self
    self.optionsTableview.dataSource = self
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = Bundle.main.loadNibNamed("OptionsCell", owner: self, options: nil)?.first as! OptionsCell

    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 4
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedCell = optionsTableview.cellForRow(at: indexPath)

    print("selectedCell")

        self.delegate?.sendCellInfo(cell: selectedCell!)
}}
class OptionsCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}}
 func sendCellInfo(cell: UITableViewCell) {

    /*** Take the cell passed and convert to a CGPoint wrt to TableView ***/
    let cellPosition: CGPoint = cell.convert(cell.bounds.origin, to: self.tableView)

     /*** wrt to CGPoint find index on current TableView ***/
    /*** Returns as Section,Cell ***/
    let indexPathForSelectedCell = (tableView.indexPathForRow(at: cellPosition)?.row)

    print(indexPathForSelectedCell)
}

下面的答案添加了@Supratik Majumdar请求我所说的逻辑

请尝试使用以下代码,我希望您能完成您的需求

//Initialize your question or answer in viewDidLoad or where ever you like to as shown below
self.questionArray = ["Question1", "Question2"]
self.optionArray = [["Option 1", "Option 2", "Option 3", "Option 4"], ["Option 1", "Option 2", "Option 3", "Option 4"]]


//Make us of the following tableview delegate & datasource code
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return self.questionArray.count
    }

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.OptionArray[section].count
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String {
    return self.questionArray[section]
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

    let currentOptionArray = self.questionArray[section]
    let currentOption = currentOptionArray[indexPath.row]

    cell.textLabel.text = currentOption

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let selectedIndex = indexPath
    let selectedQuestionIndex = indexPath.section
    let selectedOptionIndex = indexPath.row

    //Make use of the data you need in the above values
}

我不知道您为什么要采用这种方法,我建议您使用带部分(问题标题)的simple UITableView&每个部分都有特定数量的单元格(选项)。使用这种方法,您可以轻松处理上述情况。根据我对上述案例的理解,如果它不能满足您的需求,请忽略它。@Bharath是的,这是一个更简单的方法,甚至更好的设计。但是,我想知道如何做到这一点。如果你想知道,你在错误的地方使用了委托设计模式。您的
QuestionCell
应定义协议,并具有符合协议的
delegate
属性。您的
TableVC
应该采用协议并实现相应的方法(并且,在
cellForRowAt:
中,将cell
delegate
属性设置为self)。
QuestionCell
中的
didSelectRowAt
方法应该在
self.delegate?
@pbasdf上调用协议方法:你是对的。同样谢谢你。我确实做了更改,但现在我得到的O/P是nil@SupratikMajumdar尝试
self.delegate?.sendCellInfo(cell:self)
而不是
self.delegate?.sendCellInfo(cell:selectedCell!)
(即问题单元格,而不是选项单元格)。