Как я могу настроить 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.