UITableView, silmek için kaydırmayı devre dışı bırak, ancak yine de Düzenleme modunda silme işleminiz var mı?


92

Satırı silemeyeceğiniz, ancak yine de Düzenleme modunda silebileceğiniz Alarm uygulamasına benzer bir şey istiyorum.

TableView: commitEditingStyle: forRowAtIndexPath: hakkında yorum yapıldığında, silmek için kaydırmayı devre dışı bıraktım ve yine de Düzenleme modunda Sil düğmesi vardı, ancak Sil düğmesine bastığımda ne olur. Ne denir?

Yanıtlar:


288

Tamam, oldukça kolay çıkıyor. Bunu çözmek için yaptığım şey buydu:

Amaç-C

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it's in editing mode
    if (self.tableView.editing)
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

Swift 2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
         return .Delete
    }

    return .None
}

Hızlı 3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

tableView:commitEditingStyle:forRowAtIndexPath:Silme işlemini gerçekleştirmek için yine de uygulamanız gerekir .


bu daha sonra silmek için kaydırın otomatik olarak yeniden etkinleştirilir. Ya da değil?
Massimo Cafaro

Hayır, silme için hızlıca kaydır, düzenleme modunda değilse etkinleştirilmez. Bu yüzden varsayılan olarak UITableViewCellEditingStyleNone döndürüyorum.
willi

3
CommitEditingStyle içinde eğer (editorStyle == UITableViewCellEditingStyleDelete) ihtiyacınız olduğunu söylemeyi unuttum:
willi

Tamam, bu ifade ile silme eyleminiz var ama farklı görselliğe sahip. Kaydırma sürümüyle aynı görsellikte bu eyleme sahip olma şansı var mı?
Göktuğ Aral

@giuseppe Önemli değil. Kendine geri dönerek haksız değildir. Bu delege yöntemi, aynı tableView'e geri dönüyor, bu nedenle veya.
Stephen Paul

9

Sadece işleri netleştirmek için, kaydırarak silme tableView:commitEditingStyle:forRowAtIndexPath:uygulanmadığı sürece etkinleştirilmeyecektir .

Geliştirme aşamasındayken bunu uygulamadım ve bu nedenle silmek için kaydır seçeneği etkinleştirilmedi. Elbette, bitmiş bir uygulamada her zaman uygulanır, çünkü aksi takdirde düzenleme olmazdı.


4

Swift Versiyonu:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

4

CanEditRowAt işlevini uygulamanız gerekir.

EditingStyleForRowAt işlevinde .delete ile dönebilirsiniz, böylece düzenleme modunda silmeye devam edebilirsiniz.

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if tableView.isEditing {
        return true
    }
    return false
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}

2

Temel olarak, yöntemleri kullanarak düzenlemeyi etkinleştirir veya devre dışı bırakırsınız

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

Düzenleme etkinleştirilirse, kırmızı silme simgesi görünür ve kullanıcıya bir silme uyumu istenir. Kullanıcı onaylarsa, temsilci yöntemi

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

silme talebi konusunda bilgilendirilir. Bu yöntemi uygularsanız, silmek için kaydır otomatik olarak etkinleştirilir. Bu yöntemi uygulamazsanız, silmek için hızlıca kaydırın etkin değildir, ancak satırı gerçekten silemezsiniz. Bu nedenle, bildiğim kadarıyla, bazı belgelenmemiş, özel API'ler kullanmadıkça, istediğinizi elde edemezsiniz. Muhtemelen Apple uygulaması bu şekilde uygulanmaktadır.


1
Bunu, UITableViewCellEditingStyleDelete in tableView içinde döndürerek çözdüm: düzenlemeStyleForRowAtIndexPath: eğer düzenleme modundaysa.
willi

0

C # üzerinde:

Kaydırmada Sil seçeneğiyle satırları etkinleştirmek / devre dışı bırakmak için gerekli olan aynı sorunu yaşadım. Birden fazla satırın sola kaydırılması ve silinmesi gerekir, bunları başka bir renkte tutun. Bu mantığı kullanarak başardım.

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

DeleteIndexes öğelerinin, yineleme olmadan tablodan silinen dizinlerin bir listesi olduğunu unutmayın. Bu kod, bir satırın silinip silinmediğini kontrol eder, ardından kaydırmayı devre dışı bırakır veya tam tersi.

Eşdeğer delege işlevi Swift'dir canEditRowAtIndexPath.


0

Bu problemle karşılaştım ve aşağıdaki kodlarla düzelttim. umarım sana yardımcı olur.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}

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.