2014-11-24 2 views
1

Я пытаюсь создать пользовательскую ячейку для своего UITableView, но у меня есть некоторые трудности.Создание UITableViewCell программно в Swift

Во-первых, я не могу использовать Interface Builder, поскольку я испытываю a variation on this bug in Xcode. Каждый раз, когда я нажимаю на элемент в Interface Builder, все в этом представлении получает высоту и ширину нуля и перемещается за пределы представления. Кроме того, я хотел бы узнать, как это сделать программно.

Во-вторых, я использую язык Swift для моего проекта. I have been trying to follow this demonstration, и прикладываю все усилия, чтобы преобразовать код Objective C в Swift, но всякий раз, когда я сталкиваюсь с проблемами, я в конечном итоге застреваю. Я предполагаю, что это потому, что я неправильно конвертирую код.

В-третьих, I found this video, но, несмотря на то, что он довольно трудно поддается наблюдению (много кода просто скопировано и вставлено без особого объяснения тому, что он делает или почему), он все еще заканчивается использованием Interface Builder для изменения различных частей.

У меня есть базовый UITableView настроен отлично. Я просто хочу добавить пользовательскую ячейку в это представление таблицы.

  • Можно ли это сделать, используя чистое программирование, или мне нужно использовать Interface Builder?

  • Может ли кто-нибудь указать мне в правильном направлении или помочь мне в создании пользовательской ячейки программно в Swift?

Большое спасибо.

ответ

6

В общем: все возможно в чистом программировании ;-)

  1. Создать собственный класс для ячейки Tableview и там настроить все элементы, свойства и визуальный макет. Реализация требуемых методов init(style,reuseidentifier)

  2. В пользовательском классе для UITableViewController зарегистрировать пользовательский класс клеток, используя registerClass(forCellReuseIdentifier)

  3. Настройте ваш делегат и источник данных для пользовательского tableViewController

Наконец, вы создаете ячейки в cellForRowAtIndexPath:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("myReuseIdentifier", forIndexPath: indexPath) as MyCustomTableViewCell 

    // configure the cell using its properties 

    return cell 
} 

Это должны быть основные шаги.

+0

Спасибо за этот ответ - это было очень полезно! однако я застрял в регистрации пользовательского класса ячеек.Пользовательский класс ячейки настаивает на том, что этот инициализатор «требуется init (coder aDecoder: NSCoder)», и я, похоже, не могу инициализировать ячейку без этого, Xcode также выдает ошибку, если я просто пытаюсь использовать 'init (style : reuseIdentifier:) '. Какой «NSCoder» мне нужно использовать здесь? – Jimmery

+0

Хм, я думаю, я тоже застрял на этом. Могу ли я спросить, почему вы действительно хотите сделать все это по коду, где InterfaceBuilder делает вашу жизнь намного проще? – zisoft

+2

как я уже сказал - я буквально не могу использовать Interface Builder - каждый раз, когда я нажимаю на элемент, он становится репозиционированным и сокращается до нуля. Интерфейс Builder не просто делает мою жизнь труднее - это заставляет меня оторвать мои волосы. Ive также обновил Xcode до самой последней версии - похоже, что некоторые другие также испытывают эту ошибку (см. Ссылку в моем исходном сообщении). – Jimmery

5

Если вы ищете больше кода, вот пример пользовательского элемента, который я создал:

// File: vDataEntryCell.swift 
import UIKit 

class vDataEntryCell: UITableViewCell 
{ 

//----------------- 
// MARK: PROPERTIES 
//----------------- 

//Locals 
var textField : UITextField = UITextField() 

//----------------- 
// MARK: VIEW FUNCTIONS 
//----------------- 

///------------ 
//Method: Init with Style 
//Purpose: 
//Notes: This will NOT get called unless you call "registerClass, forCellReuseIdentifier" on your tableview 
///------------ 
override init(style: UITableViewCellStyle, reuseIdentifier: String!) 
{ 
    //First Call Super 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 

    //Initialize Text Field 
    self.textField = UITextField(frame: CGRect(x: 119.00, y: 9, width: 216.00, height: 31.00)); 

    //Add TextField to SubView 
    self.addSubview(self.textField) 
} 


///------------ 
//Method: Init with Coder 
//Purpose: 
//Notes: This function is apparently required; gets called by default if you don't call "registerClass, forCellReuseIdentifier" on your tableview 
///------------ 
required init(coder aDecoder: NSCoder) 
{ 
    //Just Call Super 
    super.init(coder: aDecoder) 
} 
} 

Тогда в моем классе UITableViewController я сделал следующее:

// File: vcESDEnterCityState.swift 
import UIKit 

class vcESDEnterCityState: UITableViewController 
{ 

//----------------- 
// MARK: VC FUNCTIONS 
//----------------- 


///------------ 
//Method: View Will Appear 
//Purpose: 
//Notes: 
///------------ 
override func viewWillAppear(animated: Bool) 
{ 
    //First Call Super 
    super.viewWillAppear(animated) 

    //Register the Custom DataCell 
    tvCityStateForm.registerClass(vDataEntryCell.classForCoder(), forCellReuseIdentifier: "cell") 
} 

//----------------- 
// MARK: UITABLEVIEW DELEGATES 
//----------------- 

///------------ 
//Method: Cell for Row at Index Path of TableView 
//Purpose: 
//Notes: 
///------------ 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    //Get Reference to Cell 
    var cell : vDataEntryCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as vDataEntryCell 

    //...Do Stuff 

    //Return Cell 
    return cell 
} 

} 
+0

Что это такое? TvCityStateForm в tvCityStateForm.registerClass (vDataEntryCell.classForCoder() , forCellReuseIdentifier: "cell") }. Просмотр или просмотр? – Lydia

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