UITableView hücresindeki UISwitch


82

UISwitchBir UITableViewhücreye nasıl yerleştirebilirim ? Ayarlar menüsünde örnekler görülebilir.

Mevcut çözümüm:

UISwitch *mySwitch = [[[UISwitch alloc] init] autorelease];
cell.accessoryView = mySwitch;

3
Bunu şu an yaptığınız şekilde yanlış olan ne?
MobileMon

Yanıtlar:


193

Bunu accessoryView olarak ayarlamak genellikle yapılacak yoldur. Bunu içinde ayarlayabilirsiniz tableView:cellForRowAtIndexPath: Anahtar çevrildiğinde bir şeyler yapmak için hedef / eylem kullanmak isteyebilirsiniz. Şöyle:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    switch( [indexPath row] ) {
        case MY_SWITCH_CELL: {
            UITableViewCell *aCell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCell"];
            if( aCell == nil ) {
                aCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"SwitchCell"] autorelease];
                aCell.textLabel.text = @"I Have A Switch";
                aCell.selectionStyle = UITableViewCellSelectionStyleNone;
                UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
                aCell.accessoryView = switchView;
                [switchView setOn:NO animated:NO];
                [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
                [switchView release];
            }
            return aCell;
        }
        break;
    }
    return nil;
}

- (void)switchChanged:(id)sender {
    UISwitch *switchControl = sender;
    NSLog( @"The switch is %@", switchControl.on ? @"ON" : @"OFF" );
}

1
MY_SWITCH_CELL yerine sanırım karşılık gelen hücre numarası olmalıdır. Her yerde güzel çözüm!
test

1
@Jesse 'aCell.accessoryView = switchView;' tam olarak '[aCell setAccessoryView: switchView];' ile eşdeğerdir. Noktalı gösterimden kaçınmak için bir nedeniniz var mı?
zpasternack

1
Bu cevap için çok teşekkürler! Anahtarın alt görünüm olarak eklenmesi seslendirme komutlarını karıştırır. Aksesuar görünümü olarak ayarlamak, seslendirme ile mükemmel çalışıyor!
Nitin Alabur

2
Seçilen anahtarın dizinini nasıl biliyorsunuz?
doxsi

2
@doxsi switchView.tag = indexPath.row, hangi satır anahtarının hızlı değiştiğini tespit etmek için
Nazmul Hasan

10

Hücrelere bir UISwitch veya başka bir denetim ekleyebilirsiniz accessoryView. Bu şekilde, muhtemelen istediğiniz şey olan hücrenin sağ tarafında görünecektir.


8
if (indexPath.row == 0) {//If you want UISwitch on particular row
    UISwitch *theSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
    [cell addSubview:theSwitch];
    cell.accessoryView = theSwitch;
}

Neden kullanıyorsun initWithFrame? Neden kullanıyorsun addSubview? switchdeğişken adı olarak kullanılamaz.
test

Anahtar adı için üzgünüm. Biraz kodum vardı .. Değişken adını değiştirdim.
k-thorat

Benim için çalıştı. Daha az kodla etkili çözüm.
Kenan Karakecili

2
Bu işe yalnızca hücrenin accessoryView özelliğini ayarlayarak ulaşabildim. Anahtarı bir alt görünüm olarak eklemenin gerekli olduğunu sanmıyorum.
johnnieb

2

Hücreyi Interfacebuilder'da hazırlayabilir, Viewcontroller'ınızın bir IBOutlet'ına bağlayabilir ve tablo görünümü uygun satırı istediğinde geri döndürebilirsiniz.

Bunun yerine, hücre için ayrı bir xib oluşturabilir (yine IB ile) ve hücrelerin oluşturulması üzerine UINib kullanarak yükleyebilirsiniz.

Son olarak, anahtarı programlı olarak oluşturabilir ve hücrelerinizin içerik görünümüne veya aksesuar görünümüne ekleyebilirsiniz.

Size en uygun olanı büyük ölçüde ne yapmaktan hoşlandığınıza bağlıdır. Tablo görünümlerinizin içeriği düzeltildiyse (ayarlar sayfası vb. İçin) ilk ikisi iyi çalışabilir, içerik dinamikse programlı çözümü tercih ederim. Lütfen ne yapmak istediğiniz konusunda daha net olun, bu sorunuzu yanıtlamayı kolaylaştıracaktır.


Programatik çözümü tercih ederim (bir ayarlar sayfası için olmasına rağmen), ancak ilk iki seçeneğin nasıl çalıştığını da merak ediyorum. Belki onları biraz daha detaylı açıklayabilirsiniz.
test

1

Bu ilgili kapatarak ve içinden tableView temsilciye görünüşüdür tabakası (UITableViewCell) ve ileri doğru olaylar olur daha tam bir çözüm didSelectve didDeselect:

class CustomCell: UITableViewCell {
    private lazy var switchControl: UISwitch = {
        let s = UISwitch()
        s.addTarget(self, action: #selector(switchValueDidChange(_:)), for: .valueChanged)
        return s
    }()

    override func awakeFromNib() {
        self.accessoryView = switchControl
        self.selectionStyle = .none // to show the selection style only on the UISwitch
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        (self.accessoryView as? UISwitch)?.isOn = selected
    }

    @objc private func switchValueDidChange(_ sender: UISwitch) { // needed to treat switch changes as if the cell was selected/unselected
        guard let tv = self.superview as? UITableView, let ip = tv.indexPath(for: self) else {
            fatalError("Unable to cast self.superview as UITableView or get indexPath")
        }
        setSelected(sender.isOn, animated: true)
        if sender.isOn {
            tv.delegate?.tableView?(tv, didSelectRowAt: ip)
        } else {
            tv.delegate?.tableView?(tv, didDeselectRowAt: ip)
        }
    }
}

Ve temsilcinize


func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    return false // to disable interaction since it happens on the switch
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // to make sure it is rendered correctly when dequeuing:
    // stuff
    if isSelected { // stored value to know if the switch is on or off
        tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
    } else {
        tableView.deselectRow(at: indexPath, animated: true)
    }
    // more stuff
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // do your thing when selecting
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    // do your thing when deselecting
}

0

hızlı kullanıcılar için

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "TableIdentifer")
        let switch = UISwitch()
        cell.accessoryView = switch 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.