Как я могу настроить UITableView на сгруппированный стиль


91

У меня есть UITableViewControllerподкласс с разделами. Разделы отображаются в стиле по умолчанию (без закругленных углов). Как я могу настроить стиль TableView на группировку в коде? Я не использую для этого Interface Builder, поэтому мне нужно что-то вроде

[self.tableView setGroupedStyle]

Я искал на Stack Overflow, но не смог найти ответа.


Быстрая версия: Ссылка
— Хуан Боэро,

Ответы:


108

Если я понимаю, что вы имеете в виду, вы должны инициализировать свой контроллер в этом стиле. Что-то типа:

myTVContoller = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped];

3
Как уже говорилось, это свойство нельзя изменить. Один сгруппирован всегда сгруппирован.
— Кори Флойд

Это неправильный ответ, это не решает проблему наличия подкласса UITableViewController. Если вы наследуете UITableViewController, вам необходимо переопределить конструктор, не создавая другой UITableView или UITableViewController.
— Микаэль

Как бы вы это сделали, если это контроллер подкласса, как указано в вопросе?
— Итан Чжао

132

Вы можете сделать следующее:

UITableView *myTable = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

Swift 3:

let tableView = UITableView.init(frame: CGRect.zero, style: .grouped)

12
ЭТО НАСТОЯЩЕЕ РЕШЕНИЕ! СПАСИБО. Принятый ответ неверен, по крайней мере, для OS 3.0+
— Дак

4
Обратите внимание, что в принятом решении есть опечатка. Я исправил это сейчас. Оба ответа работают для меня, но они создают разные вещи. Этот ответ - UITableView, принятый ответ - UITableViewController.
— Неванский король

3
На самом деле принятый ответ вводит в заблуждение. Пожалуйста, прочтите, что OP сказал: «У меня есть подкласс UITableViewConotroller». Принятый ответ дает ТОЛЬКО простой jane UITableViewController; без знания деталей невозможно решить проблему пользователей относительно подкласса. Этот ответ и использование self.myTable, вероятно, было бы лучше, ИМХО.
— Feloneous Cat 01

Это также работает с ограничениями в iOS8 (не знаю о iOS7) ... просто инициализируйте фрейм CGRectZeroвместе со своим стилем tableview, а затем добавьте свои ограничения, и вы получите правильный стиль вместе с вашими ограничениями.
— Глен Селле

20

Я даю вам свое решение, я работаю в «режиме XIB», вот код подкласса UITableViewController:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    return self;
}

6
Предостережение к этому решению - если он находится под навигационным контроллером в NIB, он потеряет эту ссылку и действительно запутает вас.
— Джесси Милликен

14

Ниже код работал для меня, я также использую класс UITableview

- (id)initWithStyle:(UITableViewStyle)style
{
     self = [super initWithStyle:UITableViewStyleGrouped];

     if (self)
    {

     }
    return self;
}

1
Это правильное решение для людей, использующих подкласс UITableViewController. Благодарность!
— Чад Павлиска

11

Если вы наследуете UITableViewController, вы можете просто снова запустить tableView.

Цель C:

self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

Swift:

self.tableView = UITableView(frame: CGRect.zero, style: .grouped)

6

Это не так сложно, как упоминалось в вопросе. На самом деле это довольно просто. Попробуйте это на раскадровке.

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


Если у вас уже есть tableView как часть TableViewController, это лучший вариант. Другие ответы больше сосредоточены на создании экземпляра нового tableView и т. Д.
— Картик Каннан

3

Swift 4

Использование обычного TableView

let tableView = TableView(frame: .zero, style: .grouped)

Использование TPKeyboardAvoidingTableView

let tableView = TPKeyboardAvoidingTableView(frame: .zero, style: .grouped)


2

Для установки группового стиля в самом пользовательском интерфейсе: -Выберите TableView, затем измените «стиль» (в инспекторе атрибутов)) с простого на Сгруппированный.


2

Вы также можете сделать это, если хотите использовать его в подклассе, который вы уже создали в отдельном быстром файле (вероятно, не на 100% правильно, но работает)

override init(style: UITableViewStyle) {
    super.init(style: style)
    UITableViewStyle.Grouped
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Теперь в appdelegate.swift вы можете вызвать:

let settingsController = SettingsViewController(style: .Grouped)

1

Вы можете сделать это также с помощью раскадровки / XIB

  1. Перейти к раскадровке -> Выберите свой viewController -> Выберите свою таблицу
  2. Выберите свойство "Стиль" в построителе интерфейса.
  3. Выберите "Сгруппированные"
  4. Выполнено

0

Если у вас есть один TableView для нескольких таблиц, и одна из этих таблиц сгруппирована, а другая - простая, вы можете смоделировать простой стиль с помощью функции из UITableViewDelegate:

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {   
    return CGFloat.min
}

0

быстрый 4

если вы не хотите использовать раскадровку, это может помочь.

вы можете добавить табличное представление и установить свойства в закрытии:

lazy var tableView: UITableView = {
        let tableView = UITableView(frame: .zero, style: .grouped)

        tableView.backgroundColor = UIColor(named: Palette.secondaryLight.rawValue)
        tableView.rowHeight = 68
        tableView.separatorStyle = .none
        tableView.translatesAutoresizingMaskIntoConstraints = false
        return tableView
    }()

затем добавьте subview и установите ограничения.


-5

Вы также можете попытаться сделать цвет разделительной линии четким, что может дать эффект группированного стиля:

[myTVContoller.tableView setSeparatorColor:[UIColor clearColor]];

Так разделы не рухнут.
— brduca


-28
self.tableView.style = UITableViewStyleGrouped

РЕДАКТИРОВАТЬ:

Предполагалось, что это свойство чтения / записи. В этом случае вы можете либо последовать совету Димитриса и установить стиль при создании экземпляра контроллера, либо (если вы используете XIB) вы можете установить его через IB.


Спасибо за ответ. Я не использую XIB, у меня есть контроллер вкладок с подпредставлением, которое является моим настраиваемым классом. Не уверен, где я могу разместить вызов initWithStyle, я не выполняю инициализацию TableView, это выполняется контроллером вкладок. Изменение initWithStyle в TableViewController, похоже, не работает.
— Nevan King

Как сказал димитрис, если вы не используете XIB, вы должны где-то инициализировать UITableViewController . Вот где вы хотите использовать вызов initWithStyle :.
— ничья
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.