2017-07-30 18 views
0

cell変数を作成し、重複コードを避けるためにdequeueReusableCellを割り当てたいとします。どうすればいいのか分かりません。タイプ 'UITableViewCell'の値にメンバーがありません

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     var cell : UITableViewCell! 
     if let url = media.url { 
      if Helper.isImageType(url: url) 
      { 
       cell = tableView.dequeueReusableCell(withIdentifier: newsFeedImageTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell 
       cell.imageTappedDelegate = self 
      }else 
      { 
       cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell 
       cell.videoTappedDelegate = self 
      } 
      cell.linkTappedDelegate = self 
      cell.backgroundColor = UIColor(rgb: 0xF2F2F2) 
      cell.isAccessibilityElement = true 
      cell.selectionStyle = .none 
      tableViewIndex = indexPath 
      if let _states = states?[indexPath.section]{ 
       cell.state = _states[indexPath.row] 
      } 
      return cell 
     } 
    return UITableViewCell() 
} 

あなたは私のコードが表示されている場合は、それだけの違い

let cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell 

そして

let cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell 

コードの他の行は同じです。追加セルクラス - :

私は変数これを宣言しようとしていますが、それは動作していない:型 'のUITableViewCell' の

let cell: UITableViewCell! 

値にはメンバーのimageTappedDelegate "

UPDATEを持っていません定義:

class NewsFeedTableViewViewCell : BaseTableViewCell{ 
    var statisticsSlidingCellId = "statisticsSlidingCellId" 
    var linkTappedDelegate : LinkTappedDelegate! 
    var state : State?{ 
     didSet{ 
      } 
    } 
} 

class NewsFeedImageTableViewViewCell: NewsFeedTableViewViewCell{ 
    var imageTappedDelegate : ImageTappedDelegate! 
} 

class NewsFeedVideoTableViewViewCell : NewsFeedTableViewViewCell{ 
    var videoTappedDelegate : VideoTappedDelegate! 
} 
+0

どのように2つのCellクラスを宣言しますか? - 'NewsFeedImageTableViewViewCell'と' NewsFeedVideoTableViewViewCell'。 'tableView(_:cellForRowAt:)'のコードを減らす前に、2つのクラスの重複コードを減らしましたか? – OOPer

+0

'NewsFeedImageTableViewViewCell'と' NewsFeedVideoTableViewViewCell'が 'NewsFeedTableViewViewCell'を継承しました。 –

+0

'cell'を' NewsFeedTableViewViewCell'として宣言してみましょう。 – OOPer

答えて

2

問題を解決するには、正しいtyにキャストします。代理人を割り当てる前にpe。セルを参照するたびに、UITableViewCell型のカスタム・サブクラスのプロパティ/メソッドが存在しないようにします。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     var cell : NewsFeedTableViewViewCell! 
     if let url = media.url { 
      if Helper.isImageType(url: url) 
      { 
       cell = tableView.dequeueReusableCell(withIdentifier: newsFeedImageTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell 
       (cell as ! NewsFeedImageTableViewCell).imageTappedDelegate = self 
      }else 
      { 
       cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell 
       (cell as! NewsFeedVideoTableViewCell).videoTappedDelegate = self 
      } 
      cell.linkTappedDelegate = self 
      cell.backgroundColor = UIColor(rgb: 0xF2F2F2) 
      cell.isAccessibilityElement = true 
      cell.selectionStyle = .none 
      tableViewIndex = indexPath 
      if let _states = states?[indexPath.section]{ 
       cell.state = _states[indexPath.row] 
      } 
      return cell 
     } 
    return UITableViewCell() 
} 
+0

あなたのおかげで本当に役に立ってくれてありがとうございます。 –

1

この回答はJosh Hametに非常に近いので、いくつかのコメントを追加しました。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if let url = media.url { 
     let cell: NewsFeedTableViewViewCell //<- common class 
     if Helper.isImageType(url: url) { 
      let imageCell = tableView.dequeueReusableCell(withIdentifier: newsFeedImageTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell 
      //When accessing `imageTappedDelegate`, the type of the cell needs to be `NewsFeedImageTableViewViewCell`. 
      imageCell.imageTappedDelegate = self 
      cell = imageCell 
     } else { 
      let videoCell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell 
      //When accessing `videoTappedDelegate`, the type of the cell needs to be `NewsFeedVideoTableViewViewCell`. 
      videoCell.videoTappedDelegate = self 
      cell = videoCell 
     } 
     //When accessing common properties, the type of the cell can be `NewsFeedTableViewViewCell`. 
     cell.linkTappedDelegate = self 
     cell.backgroundColor = UIColor(rgb: 0xF2F2F2) 
     cell.isAccessibilityElement = true 
     cell.selectionStyle = .none 
     tableViewIndex = indexPath 
     if let _states = states?[indexPath.section]{ 
      cell.state = _states[indexPath.row] 
     } 
     return cell 
    } 
    return UITableViewCell() 
} 
+0

@cristanlika、Xcodeで自分のコードをテストしました。私の推測でいっぱいになった部分はエラーの原因になることがありますが、決してその行はありません。私のコード全体が正しく入力されているかどうか確認してください。 – OOPer

+0

正解コードでエラーが発生しません –

+0

@cristanlika、conformationのおかげで! – OOPer

関連する問題