Ios 使用dequeueReusableCellWithIdentifier时分配UItableView单元格标记
我在故事板中定义了三个原型单元,每个单元中都包含一个Ios 使用dequeueReusableCellWithIdentifier时分配UItableView单元格标记,ios,uitableview,uistoryboard,Ios,Uitableview,Uistoryboard,我在故事板中定义了三个原型单元,每个单元中都包含一个UISegmentedControl小部件。我向用户提供两种类型的标准;一个是[ON | OFF]另一个是[1 | 2 | 3 | 4]。我需要以编程方式设置每个小部件的文本,因此我正在故事板中设置小部件标记,以便使用[cell view with Tag:XX]从正确的原型单元获取小部件。问题是,我所有的UISegmentedControl小部件都连接到同一个侦听器,我无法判断用户正在打开或关闭哪些条件。我已经看到标记值设置为cellforr
UISegmentedControl
小部件。我向用户提供两种类型的标准;一个是[ON | OFF]
另一个是[1 | 2 | 3 | 4]
。我需要以编程方式设置每个小部件的文本,因此我正在故事板中设置小部件标记
,以便使用[cell view with Tag:XX]
从正确的原型单元获取小部件。问题是,我所有的UISegmentedControl
小部件都连接到同一个侦听器,我无法判断用户正在打开或关闭哪些条件。我已经看到标记
值设置为cellforrowatinexpath
中的行号,但我已经在脚本中使用了标记
。我如何知道在我的侦听器中正在与哪一行进行交互
更新:代码剪报添加
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *retcell;
NSInteger thisrow = indexPath.row;
// retrieve the items which should be printed for this
// row. set text on widget depending on item type
OBJ_Items *items = [mCriteria objectForKey:thisrow];
if ([items.Type isEqualToString:YESNO])
{
retcell = [tableView dequeueReusableCellWithIdentifier:@"yesno"];
// get a handle to the widget in this cell in order to access it's Text property
UISegmentedControl *yesno = (UISegmentedControl *)[retcell viewWithTag:200];
// .. set text for yesno segments
// save the row numer to this object's tag so we can retrieve the item object
// on click
[yesno setTag:thisrow];
}
if ([items.Type isEqualToString:SETTING])
{
retcell = [tableView dequeueReusableCellWithIdentifier:@"setting"];
UISegmentedControl *setting = (UISegmentedControl *)[retcell viewWithTag:201];
// set text for segments...
[setting setTag:thisrow];
}
return (retcell);
}
在我看来,您应该为
YESNO
单元格和设置
单元格创建一些UITableViewCell
子类。然后在tableView:cellForRow:atIndexPath:
中,返回YESNOTableViewCell
或SETTINGTableViewCell
。大概是这样的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell *retcell;
NSInteger thisrow = indexPath.row;
// retrieve the items which should be printed for this
// row. set text on widget depending on item type
OBJ_Items *items = [mCriteria objectForKey:thisrow];
if ([items.Type isEqualToString:YESNO])
{
YESNOTableViewCell yesNoCell = [tableView dequeueReusableCellWithIdentifier:@"yesno"];
// .. set text for yesno segments
// the UISegmentedControl will be an IBOutlet @property on YESNOTableViewCell
// save the row numer to this object's tag so we can retrieve the item object
// on click
[yesNoCell.segmentedControl setTag:thisrow];
// return the yesNoCell
retcell = yesNoCell;
}
if ([items.Type isEqualToString:SETTING])
{
SETTINGTableViewCell settingCell = [tableView dequeueReusableCellWithIdentifier:@"setting"];
// set text for segments...
// the UISegmentedControl will be an IBOutlet @property on SETTINGTableViewCell
[settingCell.setting setTag:thisrow];
}
return (retcell);
}
为什么你要用标签来识别原型单元,你应该用重用标识符来完成这个任务。我想我没有清楚地解释我的问题。我重新编写了它,并添加了一个代码段。请看一看,嗯。。这是一个有趣的方法。。因此,在我的子类中,我可以简单地添加一个名为
setTableRow
或getTableRow
的方法,并相应地设置该属性?我想这可能是我摆脱困境所需要的。谢谢我发现的另一种方法是在UISegementedController
上使用addTarget
,并检索选择器中选定的行。仍然需要在表视图上实现IBOutlet
,但不需要进行子类化。