2016-05-23 4 views
0

В моем приложении я создал две пользовательские ячейки таблицы.TableViewCell не обновляется правильно swift 2.2

Проблема Теперь я столкнулся со вторым обновлением ячейки таблицы с последним элементом массива.

В cellForRowAtIndexpath элементы массива отображаются хорошо.

Рассмотрите [ "Value1", "Value2" ] это мой массив. В tableView только значение2 отображается в двух ячейках.

var title = ["value1","value2"] 

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

     let row = indexPath.row 

     let x = Id[indexPath.row] 

     if x == 0{ 

     let cell1 = tableView.dequeueReusableCellWithIdentifier("Cell1", forIndexPath: indexPath) as! MyCell1 

      return cell1 
     } 
     else{ 

     let cell2 = tableView.dequeueReusableCellWithIdentifier("Cell2", forIndexPath: indexPath) as! MyCell2 

      for index in 0..<myArray.count{ 
     cell2.titleButton.setTitle(title[index],forState:UIControlState.Normal) 
      } 
      return cell2 
     } 
    } 

Я застрял здесь, ваша помощь будет оценена по достоинству.

+0

Использование того же имени для переменной ** и ** класс довольно запутанно. Это то, что соглашение об именах (имена переменных начинаются с нижнего регистра и имена классов с заглавной буквой) для. – vadian

+0

Просто, например, я изменил это. На самом деле я использую другой класс и другую переменную. И имя класса начинается с Upper Case Sorry для путаницы. –

ответ

1

После это решение, причина, это происходит из диапазона был, потому что значение увеличивается, когда клетки были dequed а cellforrowAtIndexPath называли каждый раз, когда мы прокручивать вниз (поскольку некоторые клетки не были видны, и эти клетки dequed когда мы прокручивается вниз): -

var name = ["HouseBolo","HouseBolo1","HouseBolo2","HouseBolo3"] 
    var propertyVal:Int = 0 
    var projectVal:Int = 0 
    var type = ["Apartment","Villa","Home","Flat","Plot"] 
    var arrangedData = [String]() 
    var flatId = [0,1,2,0,0] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // I want the Expected Output in Tableview Cell is 
     // 1. Apartment 2. HouseBolo 3. HouseBolo1 4. Villa 5. Home 


     for item in flatId { 
      if item == 0 { 
       arrangedData.append(type[propertyVal]) 
       propertyVal+=1 
      } 
      else { 
       arrangedData.append(name[projectVal]) 
       projectVal+=1 
      } 
     } 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return arrangedData.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let flatDetails = flatId[indexPath.row] 

     // For Property Cell 
     if flatDetails == 0{ 
      let cell = tableView.dequeueReusableCellWithIdentifier("Cell1", forIndexPath: indexPath) as? PropertyCell 

      if(cell != nil) { 
       cell!.pType.text = arrangedData[indexPath.row] 
      } 
      return cell! 
     } 
     // For Project Cell 
     else { 

      let cellan = tableView.dequeueReusableCellWithIdentifier("Cell2", forIndexPath: indexPath) as? ProjectCell 

      if(cellan != nil) { 
      cellan!.projectName.setTitle(arrangedData[indexPath.row], forState: UIControlState.Normal) 
      } 
      return cellan! 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 
+0

Большое спасибо. Я думаю, ты это сделал. –

+0

@Sudhi 9135, можете ли вы пометить мой ответ, как принято, если он сработает для вас – MShah

+0

Конечно. Позвольте мне проверить один раз. Я получил от тебя новые знания. Я ценю это. –

0

Вы должны использовать:

let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! searchCell

в:

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

блок.

searchCell: класс типа: UITableViewCell

После этого перейдите в раскадровке и изменить идентификатор вашей ячейки с: «клетка»

+0

Я сделал все это. Я могу получить данные в каждой из разных ячеек. –

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

Вы должны добавить свой собственный TableView имя класса ячейки в месте UITableViewCell

Что-то вроде этого -

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> **custom tableview cell class name** 
{ 
} 

А также в раскадровке, изменить идентификатор вашей ячейки с: «CELL1» и «CELL2»

+0

Так как я могу вернуть сразу несколько табличных сокетов. По вашей концепции можно вернуть только одну ячейку. –

+0

Вы уже используете if..else этим, вы можете получить определенную ячейку. –

+0

Да. Я получаю определенную ячейку. Это не проблема. Данные также отображаются в ячейках. Если я напечатаю (название [0]) в моем коде, я получу вывод «value1». И печать (название [1]) будет заполнять вывод «Value2». Это не обновление в tableviewcells. –

0

в коде ...

let cell2 = tableView.dequeueReusableCellWithIdentifier("Cell2", forIndexPath: indexPath) as! MyCell2 

for index in 0..<myArray.count{ 
    cell2.titleButton.setTitle(title[index],forState:UIControlState.Normal) 
} 
return cell2 

вы повторяете «myArray» и присваиваете значение «cell2.titleButton». Cell 2 всегда будет иметь последнее значение, присвоенное его названию. Он присваивает значение «value1», а затем присваивает значение «value2». Похоже, что петля через массив кажется проблемой (предполагая, что ячейки отображаются - всегда всегда отображается заголовок из последнего элемента массива.