1

以前我在 tableview 部分标题单元格中遇到了 UISegmentedControl 的问题,我想听听主视图控制器中的值变化。

我通过addTarget在方法中使用 UISegmentedControl解决了这个问题tableView:viewForHeaderInSection,这很有效。

第一段是默认选择的,这是可行的。当点击第二段时,它会用其他数据重新加载 tableview,这是预期的行为。但是,仍然选择了第一段。这意味着我无法切换回表格视图中的原始数据。

请观看此视频,您将看到我要解释的内容。

我无法弄清楚我的代码有什么问题?

/*
 * Main View Controller
 */
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    if section == 0 {
        return nil
    }

    let sectionCell = tableView.dequeueReusableCellWithIdentifier("SegmentCell") as! SegmentTableViewCell

    // Add event for the UISegmentedControl
    sectionCell.segmentControl.addTarget(self, action: #selector(self.handleSegmentControlEvent), forControlEvents: .ValueChanged)

    return sectionCell
}

func handleSegmentControlEvent(sender: UISegmentedControl) {
    self.segmentControlIndex = sender.selectedSegmentIndex

    switch (sender.selectedSegmentIndex) {

        case 0:
            if latestTableData.count == 0 {
                loadItems("latest")
            } else {
                tableView.reloadData()
            }
            break

        case 1:
            if closestTableData.count == 0 {
                loadItems("closest")
            } else {
                tableView.reloadData()
            }
            break;

        default:
            break
    }
}

/*
 * Segment table view cell
 */
class SegmentTableViewCell: UITableViewCell {

    @IBOutlet weak var segmentControl: UISegmentedControl!

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

我看不出我做错了什么?

4

1 回答 1

2

当 tableView 重新加载时,这意味着viewForHeaderInSection也重新加载。所以,它在重新加载后处于初始阶段。所以你应该为它选择不同的方法,比如你可以在 tableview 之外添加分段控件,而不是作为 headerview 或仅重新加载行或单元格等。

例如,

[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationLeft];

更新 :

重新加载部分,

 NSRange range = NSMakeRange(0, 1);
 NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];                                     
 [self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone];

它将重新加载第一部分。有关更多详细信息,您可以参考此链接

它是 swift 中的目标 c 代码转换!

希望这会有所帮助:)

于 2016-04-27T11:53:25.440 回答