2016-08-29 5 views
-1

Я обнаружил ошибку в swift при попытке создать tableview, составленный из пользовательского cells, в зависимости от набора условий.Ошибка при создании tableview с несколькими пользовательскими ячейками

Вот мой код:

var tableData: [String] = [] 

@IBOutlet var tableView: UITableView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 
} 

// number of rows in table view 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.tableData.count 
} 

// create a cell for each table view row 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let phonenocell:MyCustomCell = self.tableView.dequeueReusableCellWithIdentifier("phonecell", forIndexPath: indexPath) as! MyCustomCell 

    let pincell:SocialCell = self.tableView.dequeueReusableCellWithIdentifier("socialcell", forIndexPath: indexPath) as! SocialCell 

    let fbcell:FacebookCell = self.tableView.dequeueReusableCellWithIdentifier("facebookcell", forIndexPath: indexPath) as! FacebookCell 

    let snapcell:SnapchatCell = self.tableView.dequeueReusableCellWithIdentifier("snapchatcell", forIndexPath: indexPath) as! SnapchatCell 

    let twitcell:TwitterCell = self.tableView.dequeueReusableCellWithIdentifier("twittercell", forIndexPath: indexPath) as! TwitterCell 

    let instacell:InstagramCell = self.tableView.dequeueReusableCellWithIdentifier("instagramcell", forIndexPath: indexPath) as! InstagramCell 


    if tableData.contains("Number") { 
     return phonenocell 
    } 

    if tableData.contains("Social") { 
     return pincell 
    } 

    if tableData.contains("Facebook") { 
     return fbcell 
    } 

    if tableData.contains("Snapchat") { 
     return snapcell 
    } 

    if tableData.contains("Twitter") { 
     return twitcell 
    } 

    if tableData.contains("Instagram") { 
     return instacell 
    } 

} 

При попытке построить и запустить я получаю построить не удалось с помощью следующей ошибки:

"Missing Return in a function expected to return 'UITableViewCell' 

Я был снова и снова мой код, но я честно не вижу, где я ошибаюсь ...

Любая помощь была бы принята с благодарностью!

+1

Что вы вернетесь, когда последний 'если '-' if tableData.contains ("Instagram") 'fail? – OOPer

+1

При каждом вызове 'cellForRowAtIndexPath' вы создаете 6 ячеек, 5 для мусора и только один для использования. Это очень неэффективно и дорого. – vadian

+0

Можете ли вы показать, как выглядит ваш tableData..and @vadian is right – Dravidian

ответ

0

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

Добавление данных, например:

return phonenocell 

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

Мой источник данных - таблица массива. Это строится на предыдущий вид, как: @IBAction func switch1Toggled(sender: UISwitch) { if mySwitch1.on { fbTextBox.text = "Selected" dataArray.append("Facebook")

И это может быть основной вопрос:

Предполагая, что вы выбрали «фейсбук», и что вы перезагрузить Tableview, каждая строка будет проходить первое условие как он содержится. Вы должны поместить это в методе:

//assuming your data source contains multiple members, and your numberOfRowsInSections... method return tableData.count, you need to get each item for each row: 

let currentTag = tableData[indexPath.row] 
if (currentTag == "something") { //e.g. Facebook 
    let somethingcell:MySomethingCell = ... 
    self.tableView.dequeueReusableCellWithIdentifier("somethingcell", forIndexPath: indexPath) as! MySomethingCell 
    return somethingcell 
} else if { 
    ... 
} 

return emptycell //this line is just for the case, when no of your conditions will pass and you don't catch all the situations... 
+0

Привет, Я гарантировал, что в моем массиве будут данные, не позволяя доступ к tableView, если массив пуст. Теперь все, что я получаю, - это правильное количество ячеек, но все они показывают одни и те же данные - первую ячейку «phonenocell». – maffeyew

+0

ОК, так что вы избавились от предыдущей ошибки, правильно. И теперь у вас есть следующая проблема. Таким образом, вы можете: 1) проверить, почему tableData.contains («Number») всегда возвращает true. Но это может быть простое объяснение. Ваш код не выделяет ваш источник данных отдельно для отдельных строк. Поэтому он всегда возвращает первое условие, потому что источник данных всегда одинаковый для всех ячеек. 2) разместите больше кода, чтобы узнать, каков ваш источник данных. – pedrouan

+0

Привет, моим источником данных является массив tableData. Это построено на предыдущем представлении как: '@IBAction func switch1Toggled (отправитель: UISwitch) { , если mySwitch1.on { fbTextBox.text = "Selected" dataArray.append ("Facebook") ' – maffeyew

0

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

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