UISwitch里面的自定义UITableViewCell不可用

时间:2009-08-24 14:30:39

标签: iphone properties uitableview uiswitch

我在自定义UISwitch(我称之为UITableViewCell的子类)中有RootLabeledSwitchTableCell

该单元格彼此相邻包含UILabelUISwitch

我有@property名为keychainSwitch,指向此自定义单元格内的切换:

@interface RootLabeledSwitchTableCell : UITableViewCell {
    IBOutlet UILabel *textLabel;
    IBOutlet UISwitch *labeledSwitch;
}

@property (nonatomic, retain) IBOutlet UILabel *textLabel;
@property (nonatomic, retain) IBOutlet UISwitch *labeledSwitch;

@end

在我的表视图委托中,我添加了一个在翻转开关状态时调用的选择器:

- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   NSString *CellIdentifier = [NSString stringWithFormat: @"%d:%d", [indexPath indexAtPosition:0], [indexPath indexAtPosition:1]];
   UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) {
       switch (indexPath.section) {
       case(kMyFirstSection): {
           switch (indexPath.row) {
               case(kMyFirstSectionFirstRow) {
                   [cellOwner loadMyNibFile:@"RootLabeledSwitchTableCell"];
                   cell = (RootLabeledSwitchTableCell *)cellOwner.cell;
                   self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch];
                   [self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched) forControlEvents:UIControlEventValueChanged];
                   break;
               }
               // ...
           }
       }
       // ...
   }
}

所以这个选择器正常工作:

- (void) keychainOptionSwitched {
   NSLog(@"Switched keychain option from %d to %d", ![self.keychainSwitch isOn], [self.keychainSwitch isOn]);
}

但是,我无法使用UISwitch实例的-setOn:animated:方法初始化其初始状态:

- (void) updateInterfaceState {
   BOOL isFirstTimeRun = [[[NSUserDefaults standardUserDefaults] objectForKey:kIsFirstTimeRunKey] boolValue];
   if (isFirstTimeRun) {
      [self.keychainSwitch setOn:NO animated:NO];
   }
}

从测试开始,self.keychainSwitchnil,导致-setOn:animated无法执行任何操作,但我仍然可以操作开关,NSLog语句将正确打印开关状态变化,例如:

[Session started at 2009-08-24 07:04:56 -0700.]
2009-08-24 07:04:58.489 MyApp[29868:20b] keychain switch is: nil
2009-08-24 07:05:00.641 MyApp[29868:20b] Switched keychain option from 1 to 0
2009-08-24 07:05:01.536 MyApp[29868:20b] Switched keychain option from 0 to 1
2009-08-24 07:05:02.928 MyApp[29868:20b] Switched keychain option from 1 to 0

self.keychainSwitch委托方法中设置UITableView是否遗漏了一些内容?

3 个答案:

答案 0 :(得分:70)

我花了很多时间摆弄着自定义的UITableViewCells,带有一个简单的标签并在它上面切换它之前我发现我可以添加一个UISwitch作为附件视图。无论如何你可能都知道这个,并且出于其他原因想要自定义单元格,但以防万一我想提一下!

你这样做如下(在-tableView:cellForRowAtIndexPath方法中):

UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;

accessoryView位还可以处理尺寸和位置,因此我们可以使用CGRectZero。

然后您可以使用系统控制事件和setOn方法,如下所示(注意我们将其转换为我们知道的UISwitch指针):

[(UISwitch *)cell.accessoryView setOn:YES];   // Or NO, obviously!
[(UISwitch *)cell.accessoryView addTarget:self action:@selector(mySelector)
     forControlEvents:UIControlEventValueChanged];

希望有所帮助!

答案 1 :(得分:5)

我刚才这样做了。 你应该改变选择器

[self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched:) forControlEvents:UIControlEventValueChanged];

然后将您的方法更新为

-(void) keychainOptionSwitched:(id)sender {
UISwitch *tempSwitch = (UISwitch *)sender;
}

现在,temp Switch是已更改的开关。

答案 2 :(得分:0)

我认为这里发生的是你正在尝试在单元格不在视图时调用操作,所以最新发生的是当时单元格被卸载因此你得到的钥匙串开关为零,一次它进入视野,然后它重新加载后不再为零。但我发现你正在分配这样的开关

 self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch];

它是对表格单元格中的开关的引用而你没有保留它,因此它使得开关变为零,因为当单元格离开视图时卸载并且keychainSwitch因此变为零并且因此,你的班级成员也变得零。你可能想要保留ke​​ychainSwitch,然后在重建你的表时,可以从keychainSwitch或类似的东西中取出。希望这有帮助