2016-09-03 3 views
0

вот код: произошлоКак использовать идентификатор ячейки в виде таблицы?

import UIKit 

class SliderMenuTableViewController: UITableViewController { 

var tableArray = [String]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 

    let age: String 
    age = String(LoginViewController.AGE) 

    let Profile = LoginViewController.NAME! + ", " + age 

    tableArray = [Profile,"Second","Third","Fourth","Logout"] 

} 

// table view delegate method 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier(tableArray[indexPath.row], forIndexPath: indexPath) as UITableViewCell 


    cell.textLabel?.text = tableArray[indexPath.row] 
    if cell.textLabel?.text == tableArray[0] { 

     cell.imageView?.frame = CGRectMake(10, 10, 50, 50) 

     cell.imageView!.layer.borderWidth = 1 
     cell.imageView!.layer.masksToBounds = false 
     cell.imageView!.layer.borderColor = UIColor.blackColor().CGColor 
     cell.imageView!.layer.cornerRadius = cell.imageView!.frame.width/2 
     cell.imageView!.clipsToBounds = true 
     cell.imageView?.image = LoginViewController.AVATAR 
    } 


    return cell 
} 

Ошибка:

Нагрузочный приложение из-за неперехваченного исключением 'NSInternalInconsistencyException', причина: «не удалось из очереди ячейки с идентификатором Viktor, факультативный (29) - необходимо зарегистрироваться перо или класс для идентификатора или подключение ячейки прототипа в раскадровке

Я понимаю, что я должен идентификатор ячейки, как это сделать из кода вызвать в «профиль» переменного, что в моем tableArray является не статичным, и я не могу идентифицировать его из раскадровки?

+0

В интерфейсе Builder перетащите ячейку таблицы в виде таблицы. Затем вы можете добавить идентификатор. – vadian

ответ

-1

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

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

Вместо твоего:

var cell = tableView.dequeueReusableCellWithIdentifier(tableArray[indexPath.row], forIndexPath: indexPath) as UITableViewCell 

Edit:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    // here you get the each cell by indexpath.row 
    // code here to go to the another viewController accordingly 
    print("You selected cell #\(indexPath.row)!") 
} 

Edit 2: Перейдите к другой точке зрения, используя ниже код по щелчку через ячейку и показать ваши индивидуальные данных.

let vc: UIViewController = (self.storyboard?.instantiateViewControllerWithIdentifier("viewContName"))! 
self.navigationController?.pushViewController(vc, animated: true) 
+0

ОК, его wokring, но ... теперь мне нужно, щелкнув по каждому элементу ячейки, чтобы перейти к другому диспетчеру просмотра. до этого у меня было 5 ячеек с другими идентификаторами, и я просто установил segue из раскадровки, чтобы перейти к viewcontroller, который я хочу. но теперь, как я это делаю? –

+0

Этот метод dequeue не должен использоваться. Вы должны использовать ту, которая указана в указателе, и правильно зарегистрировать класс или nib. Это даже в документах. Не отказывайтесь от отклонения кода. – Fogmeister

+0

В основном метод 'dequeueReusableCellWithIdentifier: forIndexPath: 'отлично. Проблема вызывает только * динамический *. – vadian

0

Вы не получили надлежащего идентификатора ячейки в ячейке, из-за этого он сбой. CellIdentifier, который вы должны предоставить здесь в методе, который вы собираетесь использовать для ячейки. Поместите тот же идентификатор для той же ячейки в раскадровке.

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

    //configure your cell 

    return cell 
} 

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

Регистрация Пользовательские ячейки

tableView.registerClass(MyCell.classForCoder(), forCellReuseIdentifier: kCellIdentifier) 

Регистрация Пользовательские ячейки с XIb:

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

Обновлено: даже вы можете назначить идентификатор ячейки в XIB, если вы создаете c через XIB.

+0

Гораздо удобнее - особенно для новичков - использовать прототипы ячеек в Interface Builder, чем регистрировать ячейки в коде. – vadian

+0

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

+0

Я не был тем, кто проголосовал. – vadian

0

enter image description here

здесь раскадровки. first Я использую SWRevealViewController в качестве слайдера. теперь, нажав на ячейку в меню, как вы говорите мне, что он перемещается в другой контроллер просмотра, но меню там не работает.

и я использовал этот код:

пусть mainStoryboard = UIStoryboard (название: "Main", расслоение: NSBundle.mainBundle()) пусть ВК: UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier ("Профиль") как UIViewController самостоятельно.presentViewController (ЖЕЛ, анимированные: правда, завершение: ноль)

это:

let vc: UIViewController = (self.storyboard?.instantiateViewControllerWithIdentifier("viewContName"))! 

self.navigationController .pushViewController (ЖЕЛ, анимированные: правда)

не работает. как перейти к контроллеру просмотра профиля и меню по-прежнему работать?

+0

отредактируйте свои вопросы, не отправляйте вопросы, как мы здесь, мы обязательно вам поможем. – vaibhav

+1

Общее утверждение для понимания дизайна пользовательского интерфейса: Если вы используете один раскадровки ** и ** segues, вам ** не нужно ** 'instantiateViewControllerWithIdentifier 'или' registerClass/registerNib' ** ** **. Вам ** нужно ** их только в том случае, если вы хотите загрузить пользовательский интерфейс из других nibs или раскадровки или использовать несколько раскадровки или создавать ячейки и контроллеры в коде. – vadian