回答編集履歴

2 s

_Kentarou

_Kentarou score 8375

2017/04/16 11:40  投稿

検索はかかっていますが、表示する配列数を返すところが`return Title.count`となっていて常に`3`になってしまっています。  
 
あとはセルを作成するところも、検索した配列を見ていないのでダメですね。  
 
 
---  
 
画像名、タイトルなど別々の配列として定義していますが、クラスや構造体を以下の様に定義した方が良いと思います。
```swift
struct CatData {
   /// タイトル
   var title: String
   /// 画像名
   var imageName: String
   /// セルの説明
   var description: String
}
```
それをふまえてコードを変更してみました、確認してみてください。
```swift
import UIKit
struct CatData {
   /// タイトル
   var title: String
   /// 画像名
   var imageName: String
   /// セルの説明
   var description: String
}
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
   
   //TableViewのoutlet
   @IBOutlet weak var allBusTableView: UITableView!
   
   //サーチバーのoutlet
   @IBOutlet weak var searchBar1: UISearchBar!
   
   // CatDataの配列
   var catDataArray: [CatData] = []
   
   //searchBar検索結果配列
   var searchResult: [CatData] = []
   
   override func viewDidLoad() {
       super.viewDidLoad()
       
       searchBar1.delegate = self
       searchBar1.enablesReturnKeyAutomatically = true
       
       createData()
   }
   
   func createData() {
       catDataArray.append(CatData(title: "猫1", imageName: "cat1.jpg", description: "猫1です"))
       catDataArray.append(CatData(title: "猫2", imageName: "cat2.jpg", description: "猫2です"))
       catDataArray.append(CatData(title: "猫3", imageName: "cat3.jpg", description: "猫3です"))
       searchResult = catDataArray
   }
   
   //セルの個数を指定するデリゲードメソッド(必須)
   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       
       return searchResult.count
   }
   
   //セルの値を設定するデリゲードメソッド(必須)
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       //セルを取得
       let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! CustomTableViewCell
       
       let catData = searchResult[indexPath.row]
       cell.setCell(catData.imageName, titleText: catData.title, descriptionText: catData.imageName)
       
       return cell
   }
   
   func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
       searchBar.endEditing(true)
   }
   
   //検索結果ボタン押下時のメソッド
   func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       
       //検索結果配列を空にする
       searchResult.removeAll()
       
       if searchText.isEmpty {
           searchResult = catDataArray
       } else {
           
           searchResult = catDataArray.filter {
               
               // 前方一致の場合
               // $0.title.hasPrefix(searchText)
               
               // 後方一致の場合
               // $0.title.hasSuffix(searchText)
               
               // 部分一致の場合
               $0.title.contains(searchText)
           }
       }
       allBusTableView.reloadData()
   }
}
```
1 s

_Kentarou

_Kentarou score 8375

2017/04/16 11:37  投稿

検索した配列の数を返さないとセルの数が変更されないので以下の様にしてみてください。
画像名、タイトルなど別々の配列として定義していますが、クラスや構造体を以下の様に定義した方が良いと思います。
```swift
//セルの個数を指定するデリゲードメソッド(必須)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
struct CatData {
   /// タイトル
   var title: String
   /// 画像名
   var imageName: String
   /// セルの説明
   var description: String
}
```
それをふまえてコードを変更してみました、確認してみてください。
```swift
import UIKit
struct CatData {
   /// タイトル
   var title: String
   /// 画像名
   var imageName: String
   /// セルの説明
   var description: String
}
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
   
   return searchResult.count
   //TableViewのoutlet
   @IBOutlet weak var allBusTableView: UITableView!
   
   //サーチバーのoutlet
   @IBOutlet weak var searchBar1: UISearchBar!
   
   // CatDataの配列
   var catDataArray: [CatData] = []
   
   //searchBar検索結果配列
   var searchResult: [CatData] = []
   
   override func viewDidLoad() {
       super.viewDidLoad()
       
       searchBar1.delegate = self
       searchBar1.enablesReturnKeyAutomatically = true
       
       createData()
   }
   
   func createData() {
       catDataArray.append(CatData(title: "猫1", imageName: "cat1.jpg", description: "猫1です"))
       catDataArray.append(CatData(title: "猫2", imageName: "cat2.jpg", description: "猫2です"))
       catDataArray.append(CatData(title: "猫3", imageName: "cat3.jpg", description: "猫3です"))
       searchResult = catDataArray
   }
   
   //セルの個数を指定するデリゲードメソッド(必須)
   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       
       return searchResult.count
   }
   
   //セルの値を設定するデリゲードメソッド(必須)
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       //セルを取得
       let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! CustomTableViewCell
       
       let catData = searchResult[indexPath.row]
       cell.setCell(catData.imageName, titleText: catData.title, descriptionText: catData.imageName)
       
       return cell
   }
   
   func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
       searchBar.endEditing(true)
   }
   
   //検索結果ボタン押下時のメソッド
   func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       
       //検索結果配列を空にする
       searchResult.removeAll()
       
       if searchText.isEmpty {
           searchResult = catDataArray
       } else {
           
           searchResult = catDataArray.filter {
               
               // 前方一致の場合
               // $0.title.hasPrefix(searchText)
               
               // 後方一致の場合
               // $0.title.hasSuffix(searchText)
               
               // 部分一致の場合
               $0.title.contains(searchText)
           }
       }
       allBusTableView.reloadData()
   }
}
 
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る