2017-01-16 2 views
0

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

Например, в фиде Facebook может быть много типов сообщений. Но подобная/comment/share панель внизу каждого сообщения такая же. Как я могу реализовать эти различные типы ячеек, сохраняя как/comment/share панель в одном месте на Xcode.

Заранее спасибо

+1

Подкласс 'UITableViewCell'? –

+0

Не могли бы вы немного объяснить это в разделе ответа? Спасибо @CodeDifferent –

+0

Создайте UIView (Xib или Programmatically, что легко для вас). Я рекомендую создать функцию, которая возвращает UIView, которая является общей для каждой ячейки. И когда вы вызываете «cellForRowAt». Добавьте этот UIview в качестве подзадачи ContentView. –

ответ

1

Использование видеоряда

что вы можете сделать, это подкласс UIView, который будет содержать все общие черты.

Например:

class ViewWithBorder : UIView{ 

    //any view that you apply this class on in storyboard will 
    //have the following properties assigned to it 
    override func awakeFromNib() { 

     super.awakeFromNib() 

     self.layer.borderColor = UIColor.blue.cgColor 

     self.layer.borderWidth = 1.0 

     //programmatically add buttons and whatever you desire to this view here 
    } 
} 

Теперь в раскадровку, у вас есть мобильный прототип, созданный, просто добавьте UIView внутри клетки и установить его класс viewWithBorder. Все свойства, назначенные ему в awakeFromNib, будут добавлены к этому представлению во время выполнения.

Примечание: Если вы создаете вид программно, а не с помощью раскадровки, вам придется переопределить initWithCoder

ИЛИ

Создать XIb для нового UIView, которые будут общими для всех взгляды и просто добавьте его в свою камеру, если его нуль в вашем cellForRow.

+0

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

+1

Я не думаю, что вы можете делать в раскадровке напрямую, но вы можете взглянуть на создание и использование xibs, есть много вопросов относительно того же здесь. Xibs - это по сути отдельные компоненты предметов, которые вы можете поместить в раскадровку. Я лично просто добавляю их программно. Добавьте к неидентичной части ячейки, используя подход, пример которого я только что дал или использовал xib? – Rikh

1

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

class MyCommonCell: UITableViewCell { 

//declare variables init views and other things your tableview cells will have in common 

override init() { //do your initialisation here 
    } 
} 


class MyCell: MyCommonCell { 
//add here the different items from the cell following the same architecture as above 
} 

Редактировать, чтобы ответить на комментарий: Мой вопрос был специфичным использовать общий комплексный UIView, с кнопками, действия/цели и т.д. Как я могу это осуществить?

Для того, чтобы сделать это, то вам необходимо создать класс, который EXTENS UIView

class MyExampleClass: UIView {} 

, а затем создать новый файл, который содержит .xib вид, этот вид, то вы можете связать новые MyExampleClass и добавить выходы к нему

+0

это будет лучшей практикой для вашего дела – John

1

Допустим, вы хотите реализовать вид клетки с цветной точкой на левой стороне:

Во-первых, определить пользовательский сотовый класс:

import UIKit 

@IBDesignable class MyTableViewCell : UITableViewCell { 
    @IBInspectable var dotColor: UIColor = UIColor.gray 

    override func draw(_ rect: CGRect) { 
     super.draw(rect) 

     let radius = rect.height/8 
     let center = CGPoint(x: 20, y: rect.midY) 

     let context = UIGraphicsGetCurrentContext()! 
     context.addArc(center: center, radius: radius, startAngle: 0, endAngle: 2 * CGFloat.pi, clockwise: true) 
     context.setFillColor(dotColor.cgColor) 
     context.fillPath() 
    } 
} 

Теперь переходим к Interface Builder и дизайна ваш прототип клетки, изменяя их класс MyTableViewCell:

Interface Builder

+0

Мой вопрос был специфическим для использования общего сложного uiview, с кнопками, действиями/целями и т. Д. Как я могу его реализовать? –

+0

Добавьте эти кнопки в «MyTableViewCell» и соедините действие/цели, как обычно. Вам нужно предоставить больше подробностей для меня, чтобы помочь вам за этим. –

0

Я думаю, что ответ потому что ваш вопрос должен зависеть от требований.

Если вы хотите реализовать панель как в FB

К примеру, в Facebook корма, может быть много типов сообщений. Но подобная/comment/share панель внизу каждого сообщения такая же. Как я могу реализовать эти различные типы ячеек, сохраняя как/comment/share панель в одном месте на Xcode.

По-моему, вы должны создать небольшую ячейку с панелью. Не создавайте «большие ячейки». Ячейка должна быть как можно меньше, повторное использование будет быстрее, чем большая ячейка. Также это будет проще, чем «большая ячейка» с подклассом.

Таким образом, вы будете иметь, как этот л

VideoPost cell 
like/comment/share panel cell 
ImagePost cell 
like/comment/share panel cell 
AudioPost cell 
like/comment/share panel cell 
.... 

И вы можете легко использовать его в будущем. Надеюсь, это поможет вам.

+0

Вопрос не о маленькой и большой ячейке. О том, как использовать идентичную часть с одним xib. –

0

Прежде всего, создайте в него пустой элемент xib и Add UIView. Создайте класс (Тип: UIView Пусть Предположим, что «CommonView») добавляет этот класс с xib и делает необходимое соединение, Outlet и Action.

Add 
var uiview:CommonView? 

GOTO : heightForRowAt{ 
Set height of cell based on needed calculation. 
return height 
} 
Then Goto 
cellForRowAt{ 
var cell: TableViewCell! = tableView.dequeueReusableCell............. 
// Code for your Xib 

self.uiview?.frame = CGRect(x: cell.dynamicLabel.frame.origin.x , y: cell.dynamicLabel.frame.origin.y + size + (self.uiview?.frame.size.height)! ,width: (self.uiview?.frame.width)!, height: (self.uiview?.frame.height)!) 


self.uiview?.uielementAddedToViewXib/////// 


cell.contentView.addSubview(self.uiview!) 


return cell 
} 

Пожалуйста, проверьте Code here Пожалуйста, дайте мне знать свою работу или нет.

+0

Могу я узнать, что случилось с кодом? –

+0

Im not the downvoter.Я проверю код n let u knw. –

+0

Хорошо, на самом деле я сделал код для этого сообщения, а кто-то без изменений. Нет проблем, это работает для вас или нет? –

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