- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试找出向我的 UITableView 的 header 添加和管理 UISwitch 的最佳方法,到目前为止,我已经阅读了几个关于如何最好地在表中使用 UISwitch 的链接:here , here和 here .这些链接演示了在单元格中使用 UISwitch,而我在标题的自定义 UIView 中使用它们。也就是说,我更愿意使用标签来管理这些对象,但我无法弄清楚为什么 viewWithTag 方法不起作用。
旁注:我能够在运行时将 UISwitch 放入 NSMutableArray 中并以这种方式管理它们,但我不想那么冗长,管理数组上的边界违规/索引或检查 nil 列表等... 我也不清楚如何使用 IBOutlets 执行此操作。这就是我尝试标签方法的原因。
我的目标是使用开关折叠/展开每个部分中的行,这就是为什么我想标记 UISwitches 并将其作为 subview 添加到我在 viewForHeaderInSection 中返回的 UIView。然后当我需要执行一些逻辑来折叠单元格时重新引用它们。此外,在运行时我可能有 1 个或多个部分,因此硬编码标签号是不切实际的。这是该方法的代码:
假设:
#define kSwitchTagRange 2000
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 44)];
// Add UISwitches and ensure that UISwitch doesn't already exist for this section...
UISwitch *switchView = (UISwitch*)[self.tableView viewWithTag:(kLayerSwitchTagRange + section)];
if (switchView == nil) {
// Create switch
switchView = [[UISwitch alloc] init];
double xOffset = self.tableView.bounds.size.width - switchView.frame.size.width;
switchView.frame = CGRectMake(xOffset,
7,
switchView.frame.size.width,
switchView.frame.size.height);
[switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
// Should we tag the switch view?
switchView.tag = kSwitchTagRange + section;
}
// Add switch as subview
[view addSubview:switchView];
return view;
}
在 switchChanged 中:我只是重新加载表的数据:
- (void)switchChanged:(id)sender {
[self.tableView reloadData];
}
最后,当重新创建表的数据时,我尝试检索 UISwitch 并确定它的开/关状态,然后如果关闭则返回 0 作为该部分中的行数,如果打开则返回其他一些数字:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSInteger rowCount = 0;
UISwitch *switchView = (UISwitch*)[self.view viewWithTag:(kSwitchTagRange + section)];
if (switchView != nil && switchView.isOn == NO)
{
rowCount = 0;
}
else
{
// Row count is something other than 0
rowCount = 3;
}
return rowCount;
}
不幸的是,这个 switchView 总是 nil。
我有一些猜测,但无法确定为什么会这样。
谁能告诉我为什么上面的 viewWithTag 方法会返回 nil?我倾向于猜测 #1,但没有找到任何文档告诉我自定义 header UIView 随时被释放。单元格被重复使用,但节标题呢?
最后,我阅读了 this post虽然关于标签使用的建议是有道理的,但它似乎根本不喜欢标签方法。如果您不觉得标签的使用很麻烦而且标签的使用很巧妙,为什么不使用标签呢?为什么标签功能可用?
真的,我只是想知道为什么 viewWithTag 方法在我的例子中返回 nil。
干杯!
最佳答案
我不确定为什么您的 viewWithTag 总是返回 nil,我认为这可能与 View 在某个时候被释放有关。
然而,标签仍然可以做你想做的事,但你需要在你的模型对象中有一个属性或键来跟踪开关的值。您可以使用标签在其操作方法中告知开关位于哪个部分,并适本地更新模型。这就是我所做的。我的模型是一个字典数组,其中键“rowData”的值是一个包含该部分所有数据的数组,键“switchValue”的值是一个 NSNumber,0 或 1,代表开关的状态.因此,我的数据如下所示:
2012-11-28 22:50:03.104 TableWithSwitchesInHeaderView[3592:c07] (
{
rowData = (
One,
Two,
Three,
Four
);
switchValue = 1;
},
{
rowData = (
Red,
Orange,
Yellow,
Green,
Blue,
Violet
);
switchValue = 1;
},
)
这是我在相关 TableView 委托(delegate)和数据源方法中的内容:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.theData.count;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 44)];
UISwitch *switchView = [[UISwitch alloc] init];
double xOffset = self.tableView.bounds.size.width - switchView.frame.size.width;
switchView.frame = CGRectMake(xOffset,7,switchView.frame.size.width,switchView.frame.size.height);
[switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
switchView.tag = kSwitchTagRange + section;
switchView.on = [[[self.theData objectAtIndex:switchView.tag - 101] valueForKey:@"switchValue"] boolValue];
[view addSubview:switchView];
return view;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 50;
}
- (void)switchChanged:(UISwitch *)sender {
NSMutableDictionary *dict = [self.theData objectAtIndex:sender.tag - 101];
[dict setValue:[NSNumber numberWithBool:sender.isOn] forKey:@"switchValue"];
[self.tableView reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
BOOL switchValue = [[self.theData[section] valueForKey:@"switchValue"] boolValue];
if (switchValue) {
return [[self.theData[section] valueForKey:@"rowData"] count];
}else{
return 0;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = [[self.theData[indexPath.section]valueForKey:@"rowData"]objectAtIndex:indexPath.row] ;
return cell;
}
我的 kSwitchTagRange #defined 为 101。此代码用于折叠开关关闭的任何部分中的行(实际上摆脱所有行)。
关于ios - UISwitch 和 viewWithTag 在 numberOfRowsInSection 中为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13617329/
我正在为我的应用程序使用 RxSwift,RxCocoa ,并实现了tableView。 当它从tableModel的viewModel获取priceData时,它显示了priceData的完整列表。
我已经在 swift 中设置了 tableview 的 delegate 和 datasource ,节数返回正确的值,但 numberOfRowsInSection 始终返回 4。所以我有两个问题
我有 6 个 NSMutableArray(monday,tuesday...saturday),我将其添加到 NSMutableArray“day”我在这个方法中做“numberOfRowsInSe
我正在尝试设置此分段表以在不同部分中显示不同的 JSON 数组,但出于某种原因,如果我在第一部分之后的任何部分中有更大的行数,我会得到 [__NSArrayM objectAtIndex:]: ind
我有一个使用 AFNetworking 加载数据的应用程序,解析收入 JSON 数据并填充表。我使用不同的类来管理 JSON 并填充 UITableView。 我需要正确设置行数。问题是,我猜它的方法
当第一次调用以下数据源时 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return self.fir
我正在从手机的音乐库中获取音乐专辑。我想将专辑分成几个部分(专辑封面作为部分标题图像),然后专辑歌曲将填充每个部分表。 我知道如何获取一组专辑,这些专辑将用于 numberOfSectionsInTa
我有三个数据(日期、 View 、文本字段)。我使用 SQLite(FMDB)。并且,它输出到 TableView 。当您运行此代码时,所有部分都会输出相同的单元格。我想在每个日期的文本字段和单元格中
我有一个 iphone 应用程序,它从作为 rss 提要的 xml 文件中读取“类别”字段。我的应用程序的工作方式是它按 xml“类别”字段中的类别在表格 View 中显示 rss 提要的内容。 我对
我在我的 View Controller 中设置了一个 UITableView,用于填充函数返回的 JSON 数据。当我加载 MatchCenterViewController 时,应用程序崩溃并且我
我正在从 appcoda 开发一个简单的表格应用程序。我对 numberOfRowsInSection 方法感到困惑。当我在 numberOfRowsInSection 方法中使用 NSLog 在控制
我得到了一个 nil,我不知道为什么。每次我选择 tableViewController1 并执行 segue 时,它都会崩溃并将错误发送给我 tableViewController2。我设置标识
我按以下方式设置 TableView DataSource: MyTable.dataSource = ViewController 使用实现协议(protocol)UITableViewDataSo
在 Swift 2 中,开发一个 UITableView,它将根据字典的内容动态创建单元格。该词典有 38 个词条。当我在属性检查器中手动将 TableView 部分设置为 38 行时,一切都按预期工
我真的需要帮助,因为我是 Swift 的新手。我遇到一个问题,我找不到返回 numberOfRowsInSection 的方法 场景: 我从 sectionArray 返回的 TableView 中有
我在尝试运行我的应用程序时不断遇到此问题。编译成功: GNU gdb 6.3.50-20050815 (Apple version gdb-1518) (Thu Jan 27 08:30:35
大家好,这是我的第一篇文章。我试图在 TableView 中显示动态数据: 我在 Dictionary 中有数据像这样var dizionarioComuni : Dictionary> = [:]对
数据已填充,但是[tableView numberOfRowsInSection:0]始终返回0。我的表中只有一部分。哪些类型的事物会导致此行为? 最佳答案 如果表中始终只有一个部分,请遵循以下命令.
我在 storybord 和 UISegmentedControl 中有一个 tableView 来用不同的数据和不同的设计填充上面提到的表格。我的问题是 numberOfRowsInSection
在我的 iOS 应用程序中,我有一个 SQLite 数据库,其中有一个包含许多行的 items 表。我避免将所有项目加载到内存中,而是仅加载当前显示在 UITableView 中的项目。 我正在使用S
我是一名优秀的程序员,十分优秀!