启用/ Disbale Tableview单元格 - iOS - Swift

时间:2018-03-01 01:39:22

标签: ios swift uitableview

我有一个表格视图,里面装有4行。

第3行将有一个复选框。我想仅在选中Row3复选框时启用第4行

所以我有一个复选框的插座(这是按钮)和点击该复选框的操作。

我的问题是如何引用下一个单元格并使其启用/ diable

我试着把那个细胞的参考作为 myTableView.cellForRow(at: index + 1)但它会抛出错误,二进制操作数无法应用于indexPath。

请建议我如何实现

4 个答案:

答案 0 :(得分:1)

我假设你有自己的自定义UITableViewCell课程。您的MyTableViewController是此tableview单元格的委托。 每当用户选中/取消选中时,你的盒子委托会告诉你的控制器它,你调用重载方法来摆脱给定的行。

这是我在我的应用中使用的解决方案。

import Foundation
import UIKit

class MyTableViewController: UITableViewController {
    private struct CurrentSetting {
        var RowAEnabled: Bool = true
        var RowBEnabled: Bool = true
        var RowCEnabled: Bool = true
        var RowDEnabled: Bool = true
        var RowEEnabled: Bool = true
        //...
        //maybe more?
    }


    /// Let's say those are your table view rows. Data or whatever.
    fileprivate var settings: [String] {
        //In here you have your static position.
        var configuration = ["Row A","Row B", "Row C"]
        //However, if some data are enabled/disabled you modify it based on settings
        if current.RowAEnabled {
            configuration += ["Row D"]
        }
        return configuration
    }
    //This is your setting for current tableview
    private var current = CurrentSetting()
}

//Use this to reload row for your enable/disable cell.
tableView.reloadRows(at: [indexPath], with: .none)

示例如何使用我的应用程序。 重要信息:设置它是tableview的数据源。物品数量。

enter image description here

答案 1 :(得分:0)

在该复选框的操作中,您可以执行tableview的class DIS_ACK(Structure): ack_fmt = '!HHIHHIIIIIIIIIIIIIII32s32s32s48s16s16s' ack_size = 248 _fields_ = [ ('header', ACK_HEADER), ('spec_version_major', c_ushort), ('spec_version_minor', c_ushort), ('device_mode', c_uint), ('reserved_0', c_ushort), ('device_mac_address_high', c_ushort), ('device_mac_address_low', c_uint), ('ip_config_options', c_uint), ('ip_config_current', c_uint), ('reserved_1', c_uint), ('reserved_2', c_uint), ('reserved_3', c_uint), ('current_ip', c_uint), ('reserved_4', c_uint), ('reserved_5', c_uint), ('reserved_6', c_uint), ('current_subnet_mask', c_uint), ('reserved_7', c_uint), ('reserved_8', c_uint), ('reserved_9', c_uint), ('default_gateway', c_uint), ('manufacturer_name', c_char_p), # 32 ('model_name', c_char_p), # 32 ('device_version', c_char_p), # 32 ('manufacturer_spec_info', c_char_p), # 48 ('serial_number', c_char_p), # 16 ('user_defined_name', c_char_p) # 16 ] def unpack(self, sock_data): self.header.unpack(sock_data) if self.header.length == self.ack_size: (self.spec_version_major, self.spec_version_minor, self.device_mode, self.reserved_0, self.device_mac_address_high, self.device_mac_address_low, self.ip_config_options, self.ip_config_current, self.reserved_1, self.reserved_2, self.reserved_3, self.current_ip, self.reserved_4, self.reserved_5, self.reserved_6, self.current_subnet_mask, self.reserved_7, self.reserved_8, self.reserved_9, self.default_gateway, self.manufacturer_name, self.model_name, self.device_version, self.manufacturer_spec_info, self.serial_number, self.user_defined_name) = struct.unpack(self.ack_fmt, sock_data[self.header.header_size:]) def pack(self): self.header.command = 0x0003 if self.header.length != self.ack_size: return self.header.pack() return self.header.pack() + struct.pack(self.ack_fmt, self.spec_version_major, self.spec_version_minor, self.device_mode, self.reserved_0, self.device_mac_address_high, self.device_mac_address_low, self.ip_config_options, self.ip_config_current, self.reserved_1, self.reserved_2, self.reserved_3, self.current_ip, self.reserved_4, self.reserved_5, self.reserved_6, self.current_subnet_mask, self.reserved_7, self.reserved_8, self.reserved_9, self.default_gateway, self.manufacturer_name, self.model_name, self.device_version, self.manufacturer_spec_info, self.serial_number, self.user_defined_name 。 之后,您可以在reloadData

内查看

像:

cellForRowAtIndexPath

或者你可以在if indexpath.row == 4 then //just my opinion, you can do whatever you want. cell.userInteractionEnabled = checkBox.isSelected 内查看,你可以从dataSource中删除它。

答案 2 :(得分:0)

我会建议优化和健壮的方式。

如果您要Datasource Array加载TableView,请在对象中添加一个名为isEnabled的额外属性。

否则

按如下方式创建Array

var cellStateArray = Array(repeating: true, count: numberOfRows)

然后当您根据切换复选框切换所需单元格索引的标记(当前它是第4行)到falsetrue中的cellStateArray

cellForRowAt方法中检查cellStateArray中相应cell index的标志,并设置userInteractionEnabled启用/禁用(如果需要,可以额外配置)

然后简单地重新加载单元格/表格

答案 3 :(得分:0)

点击checkBox,假设方法名称为 checkBoxClicked 。 你可以这样做:

@IBAction func checkBoxClicked(_ sender: Any) {
        let button = sender as! UIButton
        let clickedIndex = button.tag

        let nextIndexPath = IndexPath(item: clickedIndex+1, section: 0) // specify section here, if it's sectioned tableview
        let cell = tableView.cellForRow(at: nextIndexPath)

        // enable cell here
        cell?.isUserInteractionEnabled = true    // or reload cell
}

不要忘记将标记设置为cellForRowAtIndexPath方法中的复选框,如:

cell.checkBoxButton.tag = indexPath.row