我希望能够根据表中的数据(我可以做)在运行时动态创建包含UITableViewCell
es的UISwitch
。问题变得连接开关,以便在更改视图(导航,关闭等)时获取其值。我已尝试使用事件UIControlEventValueChanged
进行通知,但未能正确指定它,因为它在轻触该开关时进行转储。此外,似乎没有任何方法可以唯一地识别开关,因此如果所有事件都由单个例程(理想)处理,我不能区分它们。
因此...
如果我有UITableView:
@interface RootViewController : UITableViewController
{
UISwitch * autoLockSwitch;
}
@property (nonatomic, retain) UISwitch * autoLockSwitch;
-(void) switchFlipState: (id) sender;
@end
// .m文件:
@implementation RootViewController
// ...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * CellIdentifier = @"Cell";
int row = 0;
NSString * label = nil;
TableCellDef_t * cell_def = nil;
row = indexPath.row;
cell_def = &mainMenuTableCellsDef[ row ];
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
label = (NSString *) mainMenuTableCellsDef[indexPath.row].text;
[cell.textLabel setText:(NSString *) mainMenuItemStrings[ indexPath.row ]];
if (cell_def->isSpecial) // call special func/method to add switch et al to cell.
{
(*cell_def->isSpecial)(cell ); // add switch, button, etc.
}
else
{
[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
}
}
and this is the 'special' function:
-(void) autoLockSpecialItem :(UITableViewCell *) cell
{
autoLockSwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
[autoLockSwitch addTarget:self action:@selector(switchFlipState:) forControlEvents:UIControlEventValueChanged ];
[cell addSubview:autoLockSwitch];
cell.accessoryView = autoLockSwitch;
}
最后:
-(void) switchFlipState: (id) sender
{
NSLog(@"FLIPPED");
}
=============================================== ===============
问题:
点击开关时为什么会崩溃(坏选择器)?我相信我的代码遵循我看到的所有示例代码,但显然有些问题。
我不能将实例方法作为函数指针放入表中;它似乎也不喜欢类方法。如果我使它成为'C / C ++'函数,我如何访问类/实例成员变量?也就是说,如果我想将autoLockSpecialItem
调用到静态表(或合理的传真)中,以便我可以获得autoLockSwitch
成员变量?如果我将它作为一个类方法并且autoLockSwitch
变量为静态,那么它是否有效?
更简单:如何将UIControlEventValueChanged
连接到我的视图(我已经尝试过但失败了),我可以在事件处理程序中区分哪个开关已经改变了吗?
有更好的方法吗?我无法相信我是第一个必须解决此类问题的人。
道歉,请注意并注意并感谢任何和所有帮助。
:沸点:
答案 0 :(得分:0)
不知道为什么你的方法没有连接,但是一个简单的方法“在事件处理程序中区分哪个开关已经改变了”是给出(id)发送者给出的到您的事件处理程序,遍历您的tableview,并将发件人与每个表项中的任何开关(如果存在)进行比较。如果这太慢了,将发送者连接到表格单元格或类似的哈希表是一种可能的优化。
如果要使用C函数指针,则需要将对象传递给函数,以使用它来调用函数中对象的属性访问器方法。 (或者你可以将对象分配给一个全局变量,如果它显然是一个单例,但这是一个非常政治上不正确的答案。)
答案 1 :(得分:0)
首先,定义不同开关的简单方法是根据行号定义标签。当其中一个开关被点击时,您可以访问sender.tag
以获得行号。
此外,您可能应该将切换添加到单元格内容视图,而不是实际单元格[cell.contentView addSubview:autoLockSwitch]
。同样需要设置框架(注意CGRectZero
,cocoa将忽略宽度和高度,但使用x,y坐标来定义单元格中切换的位置。