Как я могу настроить дополнительный образ раскрытия информации в UITableViewCell?

Я хотел бы использовать пользовательскую версию стандартного дополнительного изображения для раскрытия информации в моем UITableView. Как я могу это сделать? Я надеюсь, что подкласс UITableViewCell не нужен для чего-то такого простого.


person jpm    schedule 31.12.2008    source источник


Ответы (9)


Вам нужно будет создать собственное представление и назначить его свойству accessoryView объекта UITableViewCell. Что-то типа:

myCell.accessoryView = [[ UIImageView alloc ] 
                       initWithImage:[UIImage imageNamed:@"Something" ]];
person codelogic    schedule 31.12.2008
comment
Если я это сделаю, я замечаю, что метод UITableViewDelegate - [tableView: accessoryButtonTappedForRowWithIndexPath:] больше не вызывается. Это ожидаемое поведение? Есть ли способ сохранить работоспособность этого метода? - person Greg Maletic; 05.01.2010
comment
Дополнительные объяснения можно найти в stackoverflow.com/questions/869421/ - person jarnoan; 06.10.2010
comment
можно ли сделать это с помощью прокси UIApperance на UITableViewCell? - person Claus; 03.07.2013
comment
Я использовал этот подход для создания подкласса UITableViewCell (DisclosureCell), а затем всех ячеек с настраиваемым индикатором раскрытия, унаследованных от DisclosureCell. - person blwinters; 24.01.2016

- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    UIImage *indicatorImage = [UIImage imageNamed:@"Arrow.png"];
    cell.accessoryView =[[[UIImageView alloc]  initWithImage:indicatorImage] autorelease];


    return cell;
}

хорошо, я делаю это с помощью кода, приведенного выше

person STUPID PROGRAMMER    schedule 20.08.2010

Я столкнулся с той же проблемой, что и Грег - вспомогательное представление не отслеживается (если вы используете UIImageView)

Я решил это так:

UIImage * image = [ UIImage imageNamed:@"disclosure-button-grey.png" ] ;
UIControl * c = [ [ UIControl alloc ] initWithFrame:(CGRect){ CGPointZero, image.size } ] ;

c.layer.contents = (id)image.CGImage ;
[ c addTarget:self action:@selector( accessoryTapped: ) forControlEvents:UIControlEventTouchUpInside ] ;
cell.accessoryView = c ;
[ c release ] ;
person nielsbot    schedule 08.01.2010
comment
Почему бы просто не использовать простой UIButton с изображением, а не возиться с содержимым слоя? - person Daniel Rinser; 08.08.2012
comment
Мне кажется, я, должно быть, пробовал это, но по какой-то причине это не сработало? Но конечно, сначала попробуйте с UIButton ... - person nielsbot; 08.08.2012
comment
При использовании настраиваемого изображения его местоположение может измениться, и у пользователя могут возникнуть проблемы с щелчком по нему, поскольку его рамка может быть маленькой. Лучше всего добавить кнопку предварительного просмотра над дополнительным представлением, чтобы вы могли управлять размером и расположением. - person david72; 19.02.2015

Существует хороший пример от Apple, показывающий, как используйте UIControl для выполнения такого рода настройки AccessoryView.

Переопределение - (void)drawRect:(CGRect)rect в UIControl - не самый простой способ, но он дает вам большую гибкость для создания красивых дополнительных представлений.

введите описание изображения здесь

person H6.    schedule 14.01.2015

Я бы сделал это так:

UIImageView *chevronImgVw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chevron_accessory_vw_img.png"]];
chevronImgVw.frame = CGRectMake(cell.accessoryView.frame.origin.x, cell.accessoryView.frame.origin.y, 10, 20);
cell.accessoryView = chevronImgVw;

Пожалуйста, попробуйте это перед тем, как проголосовать против! Потому что на данный момент у него 2 голоса за и 2 против!

person Randika Vishman    schedule 02.03.2014

Swift 4 и 5:

Это сработало для меня:

class MyCell: UITableViewCell {

// boilerplate...

    fileprivate func commonInit() {
        // This is the button we want, just need to change the image.
        accessoryType = .detailButton
    }

    open override func layoutSubviews() {
        super.layoutSubviews()
        // Grab the "detail" button to change its icon. Functionality is set in the delegate.
        if let submitButton = allSubviews.compactMap({ $0 as? UIButton }).first {
            submitButton.setImage(#imageLiteral(resourceName: "icons8-enter-1"), for: .normal)
        }
    }

   // everything else...
}

Лучше всего то, что это позволяет мне использовать tableView (_: accessoryButtonTappedForRowWith:) для обработки действий кнопки.

Я использовал это для кнопки, но тот же метод работает для изображения раскрытия, [поскольку / пока] есть только один класс в этой ветви дерева иерархии элемента, к которому вы хотите прикоснуться.


Ах да, мой код называет это:

extension UIView {
    var allSubviews: [UIView] {
        return subviews.flatMap { [$0] + $0.allSubviews }
    }
}
person AmitaiB    schedule 19.07.2019

В быстрых 4 и 5

myCell.accessoryView = UIImageView(image: UIImage(named: "Something"))
person Andres Marin    schedule 28.04.2020

ПРИМЕЧАНИЕ. НЕ устанавливайте для пользовательской ячейки тег: 0. Этот тег зарезервирован для представления textLabel. Если вы устанавливаете теги в Xcode Storyboard, вы должны установить теги для пользовательских представлений / меток на 1 или выше.

Обратите внимание на пример Apple:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

    UILabel *label;

    label = (UILabel *)[cell viewWithTag:1];
    label.text = [NSString stringWithFormat:@"%d", indexPath.row];

    label = (UILabel *)[cell viewWithTag:2];
    label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];

    return cell;
}
person Brooks Hanes    schedule 13.02.2013

Я попробовал приведенный выше код, и, похоже, он больше не работает, возможно, из-за возраста этого сообщения, поэтому я выброшу свою строку, которая дала мне настраиваемый вид аксессуаров.

[cell setAccessoryView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrowBtn"]]];

Надеюсь, кто-то сочтет это полезным.

person TomG103    schedule 28.07.2014
comment
Том, принятый ответ на эту запись - то же самое. Что мне здесь не хватает? - person jpm; 29.07.2014