2015-04-15 4 views
1

У меня есть UITableView, который всегда имеет 4 раздела. Первая секция всегда имеет 1 строку, вторая секция всегда имеет 3 строки. Тогда 3-я и 4-я секции могут иметь любое количество строк. Хотя первые два раздела являются по существу статическими ячейками, содержимое в них изменяется.UITableView с: Статические ячейки с динамическим содержимым и динамическими ячейками

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

Я нашел, что для этого сейчас я должен рассматривать всю таблицу как использование динамических прототипов, и теперь я должен реализовать все классы делегата/источника данных для каждой ячейки. В дополнение к этому, я больше не могу иметь свои ролики (даже для первых 2 разделов) непосредственно в tableViewController, но вместо этого создавать собственные подклассы для них, чтобы я мог изменять их содержимое.

Это кажется глупым, потому что они настолько просты. Есть ли лучший способ сделать это? Может быть, у меня может быть два tableViews в TVC, один, который статичен и обрабатывается одинаково для статических ячеек, и тот, который использует динамические прототипы? Если это лучший способ, как мне это реализовать? Я никогда не реализовал TableViewController, прежде чем обрабатывать более 1 TableView.

Для справки View представляет собой профиль с простыми данными о профиле человека. Первые 2 раздела - это только изображение человека, имя, адрес электронной почты и описание.

Вторые 2 секции содержат 1) список привилегированных проводок в приложении. И 2) список сообщений, созданных пользователем.

Здесь 2 фотографии, показывающие вид:

profile view top profile view bottom

ответ

1

Нет, к счастью Apple, сделал добавить статическую ячейку таблицы для UITableViewController но дорога заканчивается. Если вы хотите начать изменять контент, вам нужно переключиться на «настоящий» UITableView, настроить массивы и правильно обработать ячейки.

2 варианта.

Создайте IBOutlets для содержимого статических ячеек и напрямую измените объекты.

или ...

Настройте делегат методы и изменение содержания Tableview с помощью делегата UITableView и источник данных.

class CustomCell: UITableViewCell { 
    @IBOutlet weak var labelName: UILabel! 
} 

Ссылаясь на замечание о получении indexPath кнопки мыши из ViewController проверить следующий код. В основном я создал расширение UITableView, которое включает функцию indexPathForView. Таким образом вы можете получить точный вид (кнопку), который вы нажали для обработки любых действий с вашего UIViewController. Я предпочитаю эту технику по созданию протокола/делегата в ячейке, а затем переходе на viewController.

@IBAction func pressedItem(sender: AnyObject) { 
    let button = sender as! UIButton 
    var indexPath = self.tableView.indexPathForView(button)! 
    let object = self.arrayOfObjects[indexPath.row] 
    // Now you can fire any action and have it related to that specific cell 

// Создать класс HelpfulExtensions.swift для хранения расширений удобства, такие как этот

// MARK: - UITableView 
extension UITableView { 
    func indexPathForView (view : UIView) -> NSIndexPath? { 
     let location = view.convertPoint(CGPointZero, toView:self) 
     return indexPathForRowAtPoint(location) 
    } 
} 
// 

И я мог бы добавить, РАСШИРЕНИЯ ROCK !!!

+0

Где «правильно» использовать динамические прототипы и создавать подклассы каждой отдельной ячейки? – mharris7190

+0

Создание подклассов чрезвычайно прост и позволяет расширяемость и повторное использование. Так что да, если у вас есть пользовательская ячейка, вам нужен пользовательский класс. Очень просто добавить класс в свой класс viewController. –

+0

Я знал, что создание подклассов ячеек было легким, но я никогда не понимал (или действительно думал об этом), я мог бы просто создать подкласс непосредственно внутри одного и того же диспетчера представлений. Это определенно очищает файловую систему от некоторых! Теперь, если в одной из ячеек есть кнопка, покажите, как действие должно выполняться внутри класса этой ячейки? – mharris7190

0

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

Смежные вопросы