我有一个表格视图,里面装有4行。
第3行将有一个复选框。我想仅在选中Row3复选框时启用第4行
所以我有一个复选框的插座(这是按钮)和点击该复选框的操作。
我的问题是如何引用下一个单元格并使其启用/ diable
我试着把那个细胞的参考作为
myTableView.cellForRow(at: index + 1)
但它会抛出错误,二进制操作数无法应用于indexPath。
请建议我如何实现
答案 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的数据源。物品数量。
答案 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行)到false
或true
中的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