2015-10-24 2 views
0

Я уже сделал представление таблицы, которое позволяет пользователю добавлять задачи в представление таблицы, но теперь мне нужно добавить флажок перед каждой задачей, чтобы пользователь может выбрать, какие задачи он/она хочет отправить другому контроллеру viewController.Swift - добавление флажка в каждую ячейку в таблицеView

После того как я гугл, я понял, что нет CheckBox или RadioButton в быстры, я должен создать свой собственный «boxChecked.png» и «boxUnchecked.png»,

Вот часть моего кода, который дает мне ошибку:

if (selectedIndex == indexPath) { 
    cell.radioButton?.setImage(UIImage(named: "boxChecked"),forState:UIControlState.Normal) 
} else { 
    cell.radioButton?.setImage(UIImage(named: "boxUnchecked"),forState:UIControlState.Normal) 
} 

и ошибка это дает мне это:

'UITableViewCell?' does not have a member named 'radiobutton' 

хотя я попытался создать класс с именем TableViewCell, который является подклассом UITableViewCel л и объявил переменную RadioButton в ней нравится:

@IBOutlet weak var radioButton: UIButton! 

, но она по-прежнему не работает.

Вот код Func Tableview (Tableview: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath):

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 

     let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell") 




     if (selectedIndex == indexPath) { 
      cell.radioButton?.setImage(UIImage(named: "boxChecked"),forState:UIControlState.Normal) 
     } else { 
      cell.radioButton?.setImage(UIImage(named: "boxUnchecked"),forState:UIControlState.Normal) 
     } 






     cell.textLabel?.textAlignment = .Right 
     cell.detailTextLabel?.textAlignment = .Left 

     cell.textLabel?.text = taskMgr.tasks[indexPath.row].name 

     cell.detailTextLabel?.text = taskMgr.tasks[indexPath.row].score 







     return cell 

     //let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Default") 
     // cell.textLabel?.text = taskMgr.tasks[indexPath.row].name 
     // cell.detailTextLabel?.text = taskMgr.tasks[indexPath.row].desc 
     //return cell 

    } 
+0

Вы должны бросить клетку TableViewCell, показать весь код 'Func Tableview (Tableview: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell' метод – Alexander

+0

Я обновил свой вопрос с кодом – NABS

ответ

0

Попробуйте этот код:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellIdentifier = "cell" 
    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? TableViewCell 
    if cell == nil { 
     cell = TableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: cellIdentifier) 

    } 
    if (selectedIndex == indexPath) { 
     cell!.radioButton?.setImage(UIImage(named: "boxChecked"),forState:UIControlState.Normal) 
    } else { 
     cell!.radioButton?.setImage(UIImage(named: "boxUnchecked"),forState:UIControlState.Normal) 
    } 

    cell!.textLabel?.textAlignment = .Right 
    cell!.detailTextLabel?.textAlignment = .Left 

    cell!.textLabel?.text = taskMgr.tasks[indexPath.row].name 
    cell!.detailTextLabel?.text = taskMgr.tasks[indexPath.row].score 
    return cell! 
} 
+0

он дает мне ошибку на вторая строка «TableViewCell (стиль: UITableViewCellStyle.Subtitle)» и говорит: использование необъявленного типа «TableViewCell» – NABS

+0

@NABS, вы уверены, что создали класс TableViewCell в качестве подкласса UITableViewCell? – Alexander

+0

Да, но я удалил его, я продолжал получать ту же ошибку выше – NABS

0

Вы должны instantiatie свой собственный вид ячейки таблицы например, если вы используете Interface Builder:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    guard let cell = tableView.dequeueReusableCellWithIdentifier("IdentifierInInterfaceBuilder") as? MyCustomTableViewCell else { 
     return UITableViewCell() 
    } 

    return cell 
} 

Настройте свою ячейку в IB, как это:

Custom cell

Identifier


Я думаю, что ваш подход может быть более сложным, чем это необходимо. Когда у вас есть UITableViewCell, стандартные (нестандартные) позволяют использовать текст и изображение. Если вы установили изображение через Interface Builder (или программно), вы можете установить нормальное значение, а значение подсвечено. Это будет использовать выбранное изображение всякий раз, когда ячейка выбрана, а другая - когда нет.

Это также означает, что регулярного действия выбора будет достаточно, что сделает ячейку сотовой сетью горячей точкой, и вы можете просто получить выбранные ячейки и события для выбора и отмены выбора через встроенные делегаты и функции.

Для более сложных подходов, не подпадающих под возможности Plain UITableViewCell, вы можете использовать выделенное значение для UIImageView и изменить его после выбора или при его загрузке вначале.

class ExampleTableViewCell: UITableViewCell { 
    @IBOutlet var checkMark: UIImageView? 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     checkMark?.highlighted = selected 
    } 
} 

Вы видите, как мало кода требует и как он просто работает с потоком образом UITableView работает?

+0

Спасибо, но я не понял, как мы объявили переменную UIImageView и где именно она находится? мне нужно объявить два изображения, один из них отмечен, а другой не установлен? – NABS

+0

@IBOutlet означает выход адаптера интерфейса. Таким образом, у вас есть UITableView в Interface Builder, и вы можете добавить в него прототип ячейки таблицы. Этот прототип может иметь собственный класс, и если вы добавите UIImageView внутри этой ячейки прототипа и подключите его к IBOutlet, вы сможете манипулировать этим изображением с помощью кода в пользовательской ячейке. –

0

У вас есть UITableView. Он использует ячейки для отображения содержимого.Существует одна встроенная по умолчанию реализация ячейки: UITableViewCell. Чтобы настроить внешний вид UITableViewCell, мы создаем пользовательские ячейки, как вы делали с классом TableViewCell. Верните его, если вы его удалите.

UITableView reuse ячейки для повышения эффективности. Когда ячейка уходит с экрана, она сохраняется, и когда представление таблицы нуждается в такой же ячейке позже, она не воссоздает ее каждый раз. Он берет его из кеша (если он не пуст).

В виде таблицы может быть несколько различных типов ячеек (например, информационная ячейка пользователя, ячейки задач и т. Д.). Чтобы понять, какую ячейку следует создавать или получать из кэша, используется reuseIdentifer. reuseIdentifer обозначает вид ячейки. Итак, должен быть какой-то способ сообщить tableView, что когда мы запрашиваем "RadioButtonCell" (например), мы хотим, чтобы он создал ячейку с классом TableViewCell (ваш собственный подкласс).

Существует несколько способов сделать это. Это можно сделать с помощью раскадровки, это можно сделать с помощью кода. Если ячейка имеет (файл интерфейса) в xib, связанные с ним, вы можете сделать это с помощью

tableView.registerNib(UINib(nibName: "TableViewCell", bundle: nil)), forCellReuseIdentifier: "RadioButtonCell") 

Если вы не создали файл интерфейса для этого, вы можете сделать это с помощью

tableView.registerClass(..., forCellReuseIdentifier: ...) 

метод.

Вы можете зарегистрировать nibs один раз (например, внутри viewDidLoad). Позже в cellForRowAtIndexPath вы делаете:

var cell: TableViewCell = tableView.dequeueReusableCellWithIdentifier("RadioButtonCell) 

и настроить эту ячейку, как вы делали в вашем вопросе.

+0

Где я должен поместить: «tableView.registerNib (UINIB (имя_библиотека:« TableViewCell », bundle: nil)), forCellReuseIdentifier:« RadioButtonCell »)?? – NABS

+0

Я имею в виду, внутри функции tableView, или на новой строке независимо? – NABS

+0

Я попытался поместить его в таблицуView, и он дал мне ошибку, а также когда я вывел ее за пределы этой функции. – NABS

0

ли вы изменили тип UITableViewCell с помощью интерфейса строитель пользовательского UITableViewCell

Select your cell > Select the Identity Inspector in the right pane > change the class to your custom UITableViewCell class name.

Вам необходимо также подключить вид кнопки проверки с выходом в пользовательском классе.

Вам также необходимо добавить 2 UILabels для названия и один для деталей и соединить их тоже.

+0

У меня уже есть метки, которые имеют названия, они также добавляют и удаляют задачи, кроме того, не работает – NABS

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