2016-04-23 2 views
-1

Я создаю приложение, которое извлекает данные из Firebase. В моем «MealViewController» у меня есть TableView, у которого есть контроллер представления, поскольку он является делегатом и источником данных. Я получаю проблему «Тип« MealViewController »не соответствует протоколу« UITableViewDataSource », потому что для него требуются: numberOfRowsInSection: и: cellForRowAtIndexPath:. Однако, когда я добавляю оба, появляется другая проблема - «Определение конфликта с предыдущим значением». Я просмотрел все проблемы с переполнением стека, связанные с этим, и удачи не было. Вот мой View Controller:cellForRowAtIndexPath и numberOfRowsInSection конфликтует в tableView

class MealViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    var bgImage: UIImageView? 
    var image : UIImage = UIImage(named: "pizza")! 
    @IBOutlet weak var blurEffect: UIVisualEffectView! 
    @IBOutlet weak var mealTableView: UITableView! 
    var items = [MealItem]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 


     bgImage = UIImageView(image: image) 
     bgImage?.contentMode = .ScaleAspectFill 
     bgImage!.frame = view.layer.bounds 

     self.view.addSubview(bgImage!) 
     //self.bgImage?.addSubview(blurEffect) 
     //bgImage!.bringSubviewToFront(blurEffect) 
     view.bringSubviewToFront(blurEffect) 

     mealTableView.layer.cornerRadius = 5.0 
     mealTableView.layer.borderColor = UIColor.whiteColor().CGColor 
     mealTableView.layer.borderWidth = 0.5 


     let ref = Firebase(url: "https://order-template.firebaseio.com/grocery-items") 

     mealTableView.delegate = self 
     mealTableView.dataSource = self 


     // MARK: UIViewController Lifecycle 

     func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

      return 1 
     } 

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

     } 

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> MealsCellTableViewCell { //issue occurs here 

      let groceryItem = items[indexPath.row] 

      if let cell = mealTableView.dequeueReusableCellWithIdentifier("ItemCell") as? MealsCellTableViewCell { 


       cell.configureCell(groceryItem) 

       // Determine whether the cell is checked 

       self.mealTableView.reloadData() 

       return cell 

      } 
     } 

     func viewDidAppear(animated: Bool) { 
      super.viewDidAppear(animated) 

      // [1] Call the queryOrderedByChild function to return a reference that queries by the "completed" property 
      ref.observeEventType(.Value, withBlock: { snapshot in 

       var newItems = [MealItem]() 

       for item in snapshot.children { 

        let mealItem = MealItem(snapshot: item as! FDataSnapshot) 
        newItems.append(mealItem) 
       } 

       self.items = newItems 
       self.mealTableView.reloadData() 
      }) 

     } 



     func viewDidDisappear(animated: Bool) { 
      super.viewDidDisappear(animated) 

     } 

     func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 



     } 



    } 

    override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 

     bgImage = UIImageView(image: image) 
     bgImage?.contentMode = .ScaleAspectFill 

     bgImage!.frame = view.layer.bounds 
     self.view.addSubview(bgImage!) 
     view.bringSubviewToFront(blurEffect) 

    } 


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


     // MARK: UITableView Delegate methods 






} 
+0

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

+0

Первая проблема относится к выражению класса, вторая, которую я редактировал и помечен, который находится на cellForRowAtIndexPath –

+0

О, только что заметил, что ваши методы dataSource на самом деле вложены :) Таким образом, ваш 'cellForRowAtIndexPath' является только локальной функцией, которая невидима вне 'viewDidLoad'. Вы должны переместить все свои вложенные функции из 'viewDidLoad'. –

ответ

2

cellForRowAtIndexPath должен выглядеть следующим образом:

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

    let cellIdentifier = "ItemCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MealsCellTableViewCell 

    let groceryItem = self.items[indexPath.row] 

    cell.configureCell(groceryItem) 

    return cell 
} 

Обратите внимание, что возвращаемый клетка является MealsCellTableViewCell, который является подклассом UITableViewCell, так что соответствует этому классу.

Не изменяйте определение функции, так как это не соответствует тому, что указывает протокол делегата.

Вот ссылка на документацию Apple для конкретной реализации пользовательских элементов tableView для справки.

Create a Table View

1

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

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

    guard let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell") as? MealsCellTableViewCell else { 
     fatalError("No cell with identifier: ItemCell") 
    } 

    cell.configureCell(groceryItem) 

    return cell 
} 

Кроме того, необходимо переместить методы DataSource из viewDidLoad метода.

+0

Если делегат mealTableView перемещен из viewDidLoad(), чем проблема «Ожидаемое объявление появляется». После изменения реализации все еще существует проблема не соответствия протоколу dataSource, а новая проблема «не может преобразовать возвращаемое выражение типа« MealsCellTableViewCell »для возврата типа« UITableView » –

0

Вы возвращаете MealsCellTableViewCell вместо UITableViewCell в cellForRowAtIndexPath метод, вот в чем причина.

+0

как проблема« Определение конфликтов с предыдущим значением » 'и несоответствие с классом все еще присутствуют. –

+0

@JohnHarding Пока MealsCellTableViewCell является UITableViewCell, тогда его можно вернуть из метода, поскольку это тип UITableViewCell - это обычная практика. Однако ваше определение функции должно возвращать UITableViewCell (так оно соответствует) вместо MealsCellTableViewCell – Jay

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