UISwitch自定义的UITableViewCell内不可用(UISwitch inside cu

2019-07-03 14:15发布

我有一个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.keychainSwitchUITableView委托方法?

Answer 1:

我这样做,前一阵子。 你应该改变你的selctor

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

然后更新您的方法

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

现在tempSwitch是已更改开关。



Answer 2:

我花了年龄与一个简单的标签和交换机上的自定义UITableViewCells摆弄周围之前,我发现我可以只添加一个UISwitch作为附属视图 。 你可能知道这个反正的,并希望自定义单元格其他原因,但为了以防万一,我想提这个!

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

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

该accessoryView的位也需要照顾的大小和位置,所以我们可以用CGRectZero脱身。

然后,您就可以使用系统控制的事件和西顿方法如下(注意我们投它,我们知道它是UISwitch指针):

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

希望帮助!



Answer 3:

我觉得发生了什么这里是你试图调用操作在小区拿出来看,所以什么事情是该小区当时卸载所以你得到一个零的钥匙扣开关,一旦它进入查看那么它不再是零,因为它重新加载。 但我看到你分配,像这样的开关

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

它以表格单元的开关参考,你不保留它,因此它是因为该交换机成为零,因为,当电池超出视图卸载和keychainSwitch正在成为零的结果,因此你的类构件是变零为好。 你可能想保留keychainSwitch,然后当你重建表C ELL得到转出keychainSwitch的,或者类似的东西。 希望这可以帮助



文章来源: UISwitch inside custom UITableViewCell not available