Frage an objective-c, ios, customization, uitableview – Ändern der Farbe von UITableViewCellDeleteConfirmationControl (Löschen-Schaltfläche) in UITableViewCell

4

Derzeit versuche ich, die Schaltfläche delte in UITableViewCell anzupassen. Jetzt habe ich so etwas:

Jetzt muss ich nur noch die Farbe dieser Schaltfläche ändern, ich möchte das Verhalten nicht ändern oder es absolut benutzerdefiniert gestalten. Ich bin mir sicher, dass es möglich ist, ohne eigene Steuerelemente zum Löschen von Zeilen in UITableView zu erstellen.

Dies ist mein Code:

- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
            deleteButtonView.backgroundColor = [UIColor greenColor];
        }
    }
}

Wie könnte ich das machen?

Danke im Voraus!

@DrummerB Ich habe viel über die Anpassung dieser Schaltfläche gelesen, offensichtlich ist meine Zelle benutzerdefiniert. Ich untergeordnete UITableViewCell bereits, verstehe aber nicht, wie man einfach die Farbe ändert. Die meisten Leute möchten die Animation oder die gesamte Ansicht ändern dieser Taste. Anatoliy Gatt
Ich denke nicht, dass dies ohne eine benutzerdefinierte UITableViewCell-Unterklasse möglich ist. Warum bist du sicher, dass es möglich ist? DrummerB
Mir ist keine (dokumentierte) Möglichkeit bekannt, auf diese Schaltfläche zuzugreifen. Sie können es nur anpassen, indem Sie den Text festlegen. Sie könnten versuchen, alle Unteransichten der Zelle zu durchlaufen und die Schaltfläche zu finden (sehr schlechte und unflexible Lösung!). Aber selbst wenn Sie sie finden, hat UIButton keine Tint-Eigenschaft. Sie müssten Ihr getöntes, dehnbares Hintergrundbild in der Bildbearbeitungssoftware Ihrer Wahl erstellen. DrummerB
@DrummerB Ich möchte kein Verhalten ändern, nur die Farbe. Anatoliy Gatt

Deine Antwort

6   die antwort
2

r ist iOS 8 hinzugekommen und es funktioniert nicht mehr richtig.

Nun müssen Sie nach einer Unteransicht mit dem Namen "_UITableViewCellActionButtonmsgstr "und stelle die Hintergrundfarbe ein.

Unten ist eine modifizierte Version von Silyevsk-Code, den ich in meiner App verwendet habe.

Aufetwas von meinenUITableView Ich wollte nicht, dass der Benutzer zum Löschen streichen kann, sondern ichtat möchten, dass etwas (ein Vorhängeschloss-Symbol) angezeigt wird, wenn sie wischen.

Um dies zu tun, fügte ich einbReadOnly Variable zu meiner UITableViewCell-Klasse

@interface NoteTableViewCell : UITableViewCell

. . . 

@property (nonatomic) bool bReadOnly;

-(void)overrideConfirmationButtonColor;

@end

und ich habe silyevsk's code zu meiner .m datei hinzugefügt:

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    for(UIView *subview in view.subviews) {

        if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound)
            return subview;

        UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
        if(recursiveResult)
            return recursiveResult;
    }
    return nil;
}

-(void)overrideConfirmationButtonColor
{
    if (!bReadOnly)
        return;

    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
        if(confirmationButton)
        {
            confirmationButton.backgroundColor = [UIColor lightGrayColor];

            UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame];
            imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"];
            imgPadLock.contentMode = UIViewContentModeCenter;     //  Don't stretch the UIImage in our UIImageView

            //  Add this new UIImageView in the UIView which contains our Delete button
            UIView* parent = [confirmationButton superview];
            [parent addSubview:imgPadLock];
        }
    });
}

Außerdem musste ich den Code ändern, mit dem das gefüllt wirdUITableViewAndernfalls wird neben dem Schlosssymbol die Bezeichnung "Löschen" angezeigt:

-(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Note* note = [listOfNotes objectAtIndex:indexPath.row];
    if ( /* Is the user ,is allowed to delete this cell..? */ )
        return @"Delete";

    return @"      ";
}

Es ist immer noch hässlich und basiert auf den Annahmen, dass sich dies nicht ändern wird, wenn iOS 9 auf den Markt kommt.

4

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    for(UIView *subview in view.subviews) {
        if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview;
        UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
        if(recursiveResult) return recursiveResult;
    }
    return nil;
}

-(void)overrideConfirmationButtonColor
{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
        if(confirmationButton) confirmationButton.backgroundColor = [UIColor orangeColor];
    });
}

Dann im UITableViewDelegate:

-(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    <#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath];
    [cell overrideConfirmationButtonColor];
}

Dies funktioniert in iOS 7.1.2

Genial! funktioniert super bei mir marmor
5

und Sie können ihr Erscheinungsbild nicht einfach ändern.

Dazu müssten Sie meines Erachtens die Unteransichten der Zelle durchlaufen und ihre Eigenschaften ändern:

for (UIView *subview in self.subviews) {
    if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl") {
        // Set the background using an image.
    }
}

Natürlich sollten Sie vorsichtig sein, wenn Sie so etwas tun, da es ziemlich zerbrechlich ist. Ich würde vorschlagen, stattdessen Ihre eigenen zu rollen.

Ich würde vorschlagenSenden eines Fehlerberichts Apple um die Möglichkeit zu bitten, dies einfacher zu bearbeiten.

Aber ich sehe keine Ergebnisse, auch wenn ich versuche, eine Unteransicht wie Button hinzuzufügen, wird dies nicht funktionieren, aber UILabel passt perfekt dazu. Anatoliy Gatt
Oh, ich habe endlich die Lösung gefunden, jetzt würde ich den Code posten) Anatoliy Gatt
Ich würde den Beitrag jetzt aktualisieren, damit Sie sehen können, was ich getan habe. Anatoliy Gatt
1

Das ist die Lösung:

- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
            UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]];
            [deleteButtonView addSubview:image];
        }
    }
}
Dieser Ansatz muss für iOS 7 geändert werden. Siehe meine Antwort oben sowiestackoverflow.com/a/22350817/1758337 timothykc
1

sondern die UITableViewCell erweitern:

@implementation UITableViewCell (customdelete)
- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        for(UIView *subview2 in subview.subviews){
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
                ((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED;
//YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT
            }
        }
    }
}
@end
es funktioniert nicht mehr nach ios 7.1.2 yatanadam
funktioniert bei mir nicht Ans
Dieser Ansatz funktioniert. Möglicherweise müssen Sie dies zum UITableViewController hinzufügen, damit die benutzerdefinierte Farbe angezeigt wird. } timothykc
2

aktiviere die Löschtaste beim Streichen

// Stellen Sie sicher, dass Sie die folgenden Methoden im uitableviewcontroller haben

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"You hit the delete button.");
}

Benutzerdefinierte Textbezeichnung anstelle von Löschen festlegen.

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return @"Your Label";
}

Benutzerdefinierte Farbe für Taste Teil 1 festlegen - Warnung, dies beinhaltet technisch das Stöbern in der privaten Apple-API. Sie werden jedoch nicht daran gehindert, eine Unteransicht mithilfe einer öffentlichen Methodensuche zu ändern, die Teil von UIKIT ist.

Erstellen Sie eine uitableviewcell-Klasse (siehe auchhttps://stackoverflow.com/a/22350817/1758337 )

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        //iterate through subviews until you find the right one...
        for(UIView *subview2 in subview.subviews){
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
                //your color
                ((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor];
            }
        }
    }    
}

Noch ein Hinweis: Es gibt keine Garantie, dass dieser Ansatz in zukünftigen Updates funktioniert. Achten Sie auch darauf, dass Sie das Private erwähnen oder verwendenUITableViewCellDeleteConfirmationView Klasse kann zur Ablehnung von AppStore führen.

Stellen Sie die benutzerdefinierte Farbe für Knopf Teil 2 ein

wieder in deinem uitableviewcontroller

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    [YourTableView reloadData];
}

(Die alternative Farbe wird erst aufgerufen, wenn layoutSubviews das nächste Mal in der Tabellenzelle aufgerufen wird. Wir stellen dies also sicher, indem wir alles neu laden.)

Verwandte Fragen