swift,tableView selectedTypes按钮

时间:2017-09-27 10:47:22

标签: ios swift xcode swift3

我需要帮助,请参阅此课程

import UIKit

protocol TypesTableViewControllerDelegate: class {
  func typesController(controller: TypesTableViewController, didSelectTypes types: [String])
}

class TypesTableViewController: UITableViewController {

  let possibleTypesDictionary = ["bakery":"Bakery", "bar":"Bar", "cafe":"Cafe", "grocery_or_supermarket":"Supermarket", "restaurant":"Restaurant"]
  var selectedTypes: [String]!
  weak var delegate: TypesTableViewControllerDelegate!
  var sortedKeys: [String] {
    return possibleTypesDictionary.keys.sort()
  }

  // MARK: - Actions
  @IBAction func donePressed(sender: AnyObject) {
    delegate?.typesController(self, didSelectTypes: selectedTypes)
  }

  // MARK: - Table view data source
  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return possibleTypesDictionary.count
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("TypeCell", forIndexPath: indexPath) 
    let key = sortedKeys[indexPath.row]
    let type = possibleTypesDictionary[key]!
    cell.textLabel?.text = type
    cell.imageView?.image = UIImage(named: key)
    cell.accessoryType = (selectedTypes!).contains(key) ? .Checkmark : .None
    return cell
  }

  // MARK: - Table view delegate
  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    let key = sortedKeys[indexPath.row]
    if (selectedTypes!).contains(key) {
      selectedTypes = selectedTypes.filter({$0 != key})
    } else {
      selectedTypes.append(key)
    }

    tableView.reloadData()
  }
}

这里用户可以点击tableView的单元格,以便在下一个viewController上使用他的首选类型进行搜索,现在我需要构建一个执行相同操作的类,但是没有tableview而只有6个按钮在用户可以点击的视图中(所以只有6个不同按钮的viewController可以点击)。问题是我不知道如何传递给下一个viewController按下了什么按钮,什么不按,我怎么能建立这个类?

这是其他类中需要知道按下了哪些按钮的函数

func fetchNearbyPlaces(coordinate: CLLocationCoordinate2D) {

        mapView.clear()

        dataProvider.fetchPlacesNearCoordinate(coordinate, radius:searchRadius, types: searchedTypes) { places in
            for place: GooglePlace in places {

                let marker = PlaceMarker(place: place)

                marker.map = self.mapView

其中是“types:serchedTypes”

1 个答案:

答案 0 :(得分:0)

你想做什么被称为委托这里是你如何做到的:

  1. 像这样制作一个协议

    protocol  TransferProtocol : class
    {
        func transferData(types:[String])
    }
    
  2. 使用符合按钮使视图控制器符合该协议,我喜欢通过向我的类添加扩展来实现,如下所示:

    extension ButtonsViewController:TransferProtocol{
      func transferData(types:[String]){
      //Do whatever you want here
      }
    }
    
  3. 使用您创建的协议作为其类型在Table View Controller类中声明一个变量,这称为委托

    weak var transferDelegate:TransferProtocol?
    
  4. segue 到按钮视图控制器之前,您希望将该视图控制器设置为您刚刚创建的委托

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = segue.destination as? ButtonsViewController
        transferDelegate = vc
        vc?.transferData(types: selected)
    
    }
    
  5. 如果操作正确,您应该能够使用在表视图控制器(TypesTableViewController)中构建的数组