当segmentedControl发生变化时,在单元格之间切换

时间:2014-10-01 19:19:16

标签: ios objective-c iphone uitableview swift

我有一个包含segmentedControl的自定义UITableViewCell。这个segmentedControl假设控制第二个单元格。当segmentedControl中的索引发生更改时,它应切换到另一个自定义单元格。我该怎么做这样的事情?我已尝试在viewController中实现IBAction,但后来我无法将其连接到xib文件中的segmentedControl。如果我将该方法放在segmentedViewCell中,那么我就无法更改细胞子类。我怎样才能获得这个?

这是一个小插图。 segmentedControl和底部视图位于不同的单元格中。

enter image description here

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCellWithIdentifier("ImageViewCell", forIndexPath: indexPath) as ImageViewCell


        cell.itemImage.image = itemFile


        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
        cell.selectionStyle = UITableViewCellSelectionStyle.None
        return cell

    } else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCellWithIdentifier("UtilityViewCell", forIndexPath: indexPath) as UtilityViewCell


        cell.titleLabel.text = itemTitle
        cell.selectionStyle = UITableViewCellSelectionStyle.None
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        return cell

    } else if indexPath.row == 2 {
        let cell = tableView.dequeueReusableCellWithIdentifier("DescViewCell", forIndexPath: indexPath) as DescViewCell



        cell.selectionStyle = UITableViewCellSelectionStyle.None

        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        return cell

    }




    return nil
}

3 个答案:

答案 0 :(得分:2)

这是一步一步的。在项目的故事板中,创建一个UITableViewController场景。在其中添加UITableViewCell,如下图所示。将您的第一个单元格样式更改为“自定义”,并添加一个UISegmentedControl,其中包含非模糊的自动布局约束。

enter image description here

在设置代码之前,

  • 确保您的UITableViewController场景设置了类 “TableViewController”。
  • 确保在“属性”检查器中为UITableView选择“原型单元格”和“分组表格样式”。
  • 确保您的UISegmentedControl视图标记设置为1(参见图片)。
  • 确保包含UISegmentedControl的单元格具有 其标识符设置为“SegmentCell”。
  • 确保第二个单元格的标识符设置为“CellZero”。
  • 确保第三个单元格的标识符设置为“CellOne”。
  • 确保第四个单元格的标识符设置为“CellTwo”。

最后,您的UITableViewController类文件将包含以下代码:

import UIKit

class TableViewController: UITableViewController {

    var segment = 0

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    func segmentAction(sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:
            segment = 0
        case 1:
            segment = 1
        case 2:
            segment = 2
        default:
            break
        }
        tableView.reloadData()
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell: UITableViewCell!

        if indexPath.row == 0 {
            cell = tableView.dequeueReusableCellWithIdentifier("SegmentCell", forIndexPath: indexPath) as UITableViewCell
            cell.selectionStyle = .None //if necessary

            let segmentControl = cell.viewWithTag(1) as UISegmentedControl
            segmentControl.selectedSegmentIndex = segment
            segmentControl.addTarget(self, action: "segmentAction:", forControlEvents: .ValueChanged)
        } else {
            switch segment {
            case 0:
                cell = tableView.dequeueReusableCellWithIdentifier("CellZero", forIndexPath: indexPath) as UITableViewCell
            case 1:
                cell = tableView.dequeueReusableCellWithIdentifier("CellOne", forIndexPath: indexPath) as UITableViewCell
            case 2:
                cell = tableView.dequeueReusableCellWithIdentifier("CellTwo", forIndexPath: indexPath) as UITableViewCell
            default:
                break
            }
        }

        return cell
    }

}

答案 1 :(得分:0)

好的,这可能需要一次迭代,直到我更好地了解你的需要。

Math Flash Card History View

这是从一些闪存卡的演示项目,我使用分段控制来决定显示所有历史游戏或只是某种类型(加法,减法等)我必须处理的问题把分段控制。桌子内或桌子上方。在我的情况下,表中的问题是每次更改后视图重新加载。

但我确实使用分段控制来改变标题和单元格内容。

所以我可以发布所有这些的代码,或者我可以为表格单元格中的分段控件创建一个简短的演示代码(不确定它将如何发挥)。

答案 2 :(得分:0)

覆盖func numberOfSections(在intableView:UITableView中) - > Int {         返回1     }

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 2
}



func segmentAction(_ sender: UISegmentedControl) {
    switch sender.selectedSegmentIndex {
    case 0:
        segment = 0
    case 1:
        segment = 1
    case 2:
        segment = 2
    default:
        break
    }
    tableView.reloadData()
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell: UITableViewCell!

    if indexPath.row == 0 {
        cell = tableView.dequeueReusableCell(withIdentifier: "SegmentCell", for: indexPath as IndexPath) as UITableViewCell
       // cell.selectionStyle = .none //if necessary

        let segmentControl = cell.viewWithTag(1) as! UISegmentedControl
        segmentControl.selectedSegmentIndex = segment
        segmentControl.addTarget(self, action: #selector(JobReportTableViewController.segmentAction(_:)), for: .valueChanged)
    } else {
        switch segment {
        case 0:
            cell = tableView.dequeueReusableCell(withIdentifier: "CellZero", for: indexPath as IndexPath) as UITableViewCell!
        case 1:
            cell = tableView.dequeueReusableCell(withIdentifier: "CellOne", for: indexPath as IndexPath) as UITableViewCell!
        case 2:
            cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)as UITableViewCell!
        default:
            break
        }
    }

    return cell
}

}