2016-07-13 8 views
0

Я хочу заполнить динамическое табличное представление внутри статической ячейки tableview, одним и тем же классом для обоих. Как вы можете видеть на картинке под ячейкой «GRE Test Information».Динамический TableView внутри ячейки Static tableview

Helping Picture

Я использую код внутри класса с именем, как MenuController, который является контроллером TableView.

class MenuController: UITableViewController,MFMailComposeViewControllerDelegate  { 

@IBOutlet weak var tablle: UITableView! 

var items = [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() 
    items = ["A "," BB "] 

    tablle.delegate = self 
    tablle.dataSource = self 

    self.tablle.registerClass(MainTableViewCell.self, forCellReuseIdentifier: "cellNew") 
} 


// Table Data Source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 2 
} 


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

     print("Aasim Khaan") 

     cell.customCell01.text = items[indexPath.row] 


     return cell 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

Но это не заселять, что во время выполнения, и говорит

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

Однако я использую тот же идентификатор с именем, как cellNew как в коде и раскадровки.

+0

Почему бы не установить _sections_ вместо этого? ваша вложенная идея, похоже, не предлагает приятного UX. – holex

ответ

1

Ну после того, как усилия, изумительные по поводу этой, я нашел решение. Что касается следующего: Swift: TableView within Static UITableViewCell

Если решатель говорит: Насколько я могу определить, экспериментируя с этим, вы не можете использовать тот же UITableViewController в качестве источника данных и делегатом обоих взглядов таблицы. При статическом представлении таблицы вы не должны внедрять методы источника данных вообще. Странная вещь, даже если я отключу источник данных и делегировать соединения между моим статическим табличным представлением и контроллером табличного представления, этот вид таблицы по-прежнему вызывает numberOfRowsInSection в моем классе контроллера табличного представления. Если я явно устанавливаю источник данных на нуль в коде, это останавливает его от вызова методов источника данных, но встроенное представление динамической таблицы также не может их вызвать, поэтому эта структура не работает.

Однако вы можете обойти это, используя другой объект, который будет источником данных и делегатом встроенного динамического представления таблицы. Создайте IBOutlet для встроенного представления таблицы и установите его источник данных и делегируйте этот новый объект (класс - это DataSource в этом примере и является подклассом NSObject).

Я изменил свой код таким образом сейчас:

import Foundation 
import UIKit 
import MessageUI 

class DataSource: NSObject, UITableViewDataSource, UITableViewDelegate { 

var items : [String] = ["GRE Test Structure ","GRE Score "] 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

    return 1; 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 2; 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell 
     cell.customCell01.text = items[indexPath.row] 
     return cell 
    } 
} 


class MenuController: UITableViewController,MFMailComposeViewControllerDelegate { 

    @IBOutlet var tablle0: UITableView! 
    @IBOutlet weak var tablle: UITableView! 
    var dataSource = DataSource() 

    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() 
     tablle.delegate = dataSource 
     tablle.dataSource = dataSource 
    } 

} 

Теперь она работает точно так хорошо.

Here is the result shown by a screenshot

0

в viewDidLoad

// First Register the UITableViewcell class from nib 
let cellNib = UINib(nibName: "MainTableViewCell", bundle: bundle) 
self.tableView.registerNib(cellNib, forCellReuseIdentifier:"cellNew") 

Затем обратитесь к ниже screeshots

ШАГ 1: Выберите MainTableViewCell из удостоверения инспектора пользовательского класса-Click класса падения вниз arrow.It показывает вам, что вы list.From можно нажать MainTableViewCell

enter image description here

ШАГ 2: После того, как вы нажмете кнопку, отобразится имя с выбранной ячейкой просмотра таблицы.

enter image description here

+0

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

+0

Aasim вы создали файл MainTbleViewCell.swift? – user3182143

+0

да, очевидно! –

0

Хотя существующие ответы объясняют как вы можете сделать это, они не решают, должны ли вы это делаете. В примере, который вы указали, кажется, что все, что вам нужно, это singleUITableView с несколькими динамическими типами ячеек. Каждый тип ячейки может указывать свой contentInsets для отступов содержимого по мере необходимости.

0

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

Однако я использую тот же идентификатор, что и cellNew, как в коде и раскадровке .

Эта ошибка возникает из-за того, что вы удаляете/извлекаете ячейку прототипа из-за неправильной таблицы!

Строка в вашем cellForRowAtIndexPath должно быть:

let cell = tablle.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell

Сказав, что, даже когда-то, что работает, задавая tableViewController выступать в качестве источника данных и передавать как для статической и динамической таблицы причин проблемы позже.

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