Joh*_*ker 1 iphone uitableview uisegmentedcontrol ios
我有一个自定义的UITableViewCell,它通过单元格的contentView属性添加了一个UISegmentedControl作为子视图,如下所示:
#define TABLECELL_SEGMENT_TAG 1
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UISegmentedControl *testSegmentedControl;
// Check for a reusable cell first, use that if it exists
UITableViewCell *tableCell = [tableView dequeueReusableCellWithIdentifier:@"OurCustomCell"];
// If there is no reusable cell of this type, create a new one
if (!tableCell) {
tableCell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:@"OurCustomCell"] autorelease];
// Create our segmented control
NSArray *segmentItems = [NSArray arrayWithObjects:@"Option 1", @"Option 2", nil];
UISegmentedControl *testSegmentedControl = [[UISegmentedControl alloc] initWithItems:segmentItems];
[testSegmentedControl setTag:TABLECELL_SEGMENT_TAG];
[[tableCell contentView] addSubview:testSegmentedControl];
[testSegmentedControl release];
}
// Set the selected segment status as required
testSegmentedControl = (UISegmentedControl *)[tableCell.contentView viewWithTag:TABLECELL_SEGMENT_TAG];
...
[testSegmentedControl addTarget:self
action:@selector(segmentedControlUpdated:)
forControlEvents:UIControlEventValueChanged];
return tableCell;
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是addTarget为每个分段控件设置一个选择器,以便它识别有问题的行,一个明显的解决方案是使用分段控件的标签.但是正如您所看到的,如果通过UITableView的dequeueReusableCellWithIdentifier:方法返回现有单元格,我已经在使用标记从自定义单元格的contentView中检索控件.
因此,我只是想知道实现这一目标的最佳方法是什么?(我认为我可以简单地扩展UISegmentedControl类来添加associatedTableRow属性,但我想知道是否有更优雅的解决方案.)
因为子类化总是最糟糕的选择,我会做superview superview舞蹈.
- (IBAction)controlChanged:(UIControl *)sender
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
// do something
}
Run Code Online (Sandbox Code Playgroud)
由于iOS7更改了视图层次结构,因此上述代码无效.你需要使用indexPathForRowAtPoint::
- (IBAction)controlChanged:(UIControl *)sender {
CGPoint senderOriginInTableView = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:senderOriginInTableView];
// do something
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4336 次 |
| 最近记录: |