protocol medium extension example delegate basics and ios protocols swift

ios - medium - swift protocol and delegate example



Conforme al protocolo en ViewController, en Swift (6)

Además, es importante copiar todas las funciones no opcionales de la clase Delegado. Cmd + Haga clic en UITableViewDatasource y copie esas dos definiciones tal como están.

Para mí en beta7, el UITableViewDatasource tiene

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

Mi implementación:

var items = ["Apple", "Pear", "Banana"] func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Default") cell.textLabel?.text = items[indexPath.row] cell.detailTextLabel?.text = "Test" return cell }

Intentando cumplir con UITableViewDataSource y UITableViewDelegate dentro de una subclase Swift UIViewController.

class GameList: UIViewController { var aTableView:UITableView = UITableView() override func viewDidLoad() { super.viewDidLoad() aTableView.delegate = self aTableView.dataSource = self self.view.addSubview(aTableView) //errors on both lines for not conforming } }

Los doctores dicen que debes ajustarte a la línea de class después de : pero ahí es donde va la superclase. Otro : no funciona. Usar una lista separada por comas después de la superclase tampoco funciona

EDITAR:

Respuesta encontrada abajo. class GameList: UIViewController, UITableViewDataSource, UITableViewDelegate {

También debo adoptar todos los métodos requeridos de cada protocolo, lo que inicialmente no estaba haciendo.


Como XCode6-Beta7 lanza,

Noté que el método de protocolo de UITableViewDataSource cambió un poco y sonaba igual a un error de protocolo que funcionó bien en beta6.

Estos son los métodos requeridos para ser implementados de acuerdo con el protocolo UITableViewDataSource :

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // insert code} func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // insert code }

Es posible que desee volver a verificar la diferencia o volver a implementar el método de delegado que pensó que acaba de implementar.


Debes implementar dos métodos de requerimiento aquí:

func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int { return 10 } func tableView(tableView:UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! { let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell") cell.text = "Row #/(indexPath.row)" cell.detailTextLabel.text = "Subtitle #/(indexPath.row)" return cell }


Esta pregunta ya está contestada, pero solo quiero hacer las cosas un poco más rápidas.

En lugar de escribir protocolos en UITableViewDelegate, UITableViewDataSource puede dividirlos usando extensions lo que ayudará a organizar el código. Adición de conformidad de protocolo se describe en esta page

Para la pregunta anterior, esto se puede confirmar al protocolo utilizando la extensión:

class GameList: UIViewController { var aTableView:UITableView = UITableView() override func viewDidLoad() { super.viewDidLoad() aTableView.delegate = self aTableView.dataSource = self self.view.addSubview(aTableView) } } extension GameList: UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return list.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) return cell } } extension GameList: UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("Row Clicked at /(indexPath.row)") } }


Usee estos métodos: Hay un cambio en los métodos de fuente de datos-

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell protocol UITableViewDataSource : NSObjectProtocol { ****func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int // Row display. Implementers should *always* try to reuse cells by setting each cell''s reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell**** optional func numberOfSectionsInTableView(tableView: UITableView) -> Int // Default is 1 if not implemented optional func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? // fixed font style. use custom view (UILabel) if you want something different optional func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? // Editing // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. optional func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool // Moving/reordering // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath: optional func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool // Index optional func sectionIndexTitlesForTableView(tableView: UITableView) -> [AnyObject]! // return list of section titles to display in section index view (e.g. "ABCD...Z#") optional func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int // tell table which section corresponds to section title/index (e.g. "B",1)) // Data manipulation - insert and delete support // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change // Not called for edit actions using UITableViewRowAction - the action''s handler will be invoked instead optional func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) // Data manipulation - reorder / moving support optional func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) }

Ur código funcionará !!


Utiliza una coma:

class GameList: UIViewController, UITableViewDelegate, UITableViewDataSource { // ... }

Pero tenga en cuenta que la súper clase debe ser el primer elemento en la lista separada por comas.

Si no adopta todos los métodos requeridos del protocolo, habrá un error de compilación. ¡Debes obtener todos los métodos requeridos!