2016-05-30 88 views
1

我想为每个单元格执行一个下拉菜单,因此我已经在单元格中插入了一个tableview,并且正在处理单元格在单击时展开的扩展单元格,以便它将显示为下拉菜单。如何在swift中将一个tableview委托方法从一个类调用到另一个类?

MainTableView:

import UIKit 

class MainTableView: UIViewController,UITableViewDelegate,UITableViewDataSource { 

@IBOutlet weak var mainTableView: UITableView! 
var selectedCellIndexPath: NSIndexPath? 
let selectedCellHeight: CGFloat = 300.0 
let unselectedCellHeight: CGFloat = 44.0 
var name = ["red","green","blue","white"] 
override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

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

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return name.count 
} 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = mainTableView.dequeueReusableCellWithIdentifier("cell1" , forIndexPath: indexPath) as! mainTableViewCell 
    cell.Title.text = name[indexPath.row] 
    return cell 
} 
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if selectedCellIndexPath == indexPath { 
     return selectedCellHeight 
    } 
    return unselectedCellHeight 
} 
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath { 
     selectedCellIndexPath = nil 
    } else { 
     selectedCellIndexPath = indexPath 
    } 

    tableView.beginUpdates() 
    tableView.endUpdates() 

    if selectedCellIndexPath != nil { 
     // This ensures, that the cell is fully visible once expanded 
     tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .None, animated: true) 
    } 
} 

} 

MainTableViewCell:

import UIKit 

class MainTableViewCell:UITableViewCell,UITableViewDataSource,UITableViewDelegate { 

@IBOutlet weak var dropDownList: UITableView! 
@IBOutlet weak var Title: UILabel! 
var selectedCellIndexPath: NSIndexPath? 
let selectedCellHeight: CGFloat = 0.0 
let unselectedCellHeight: CGFloat = 44.0 
var name = ["magenta","yellow","orange","cyan","black","grey"] 
override func awakeFromNib() { 
    super.awakeFromNib() 

    dropDownList.delegate = self 
    dropDownList.dataSource = self 
} 

override func setSelected(selected: Bool, animated: Bool) 
{ 
    super.setSelected(selected, animated: animated) 
} 
func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return name.count 
} 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = dropDownList.dequeueReusableCellWithIdentifier("cell2", forIndexPath: indexPath) as! subTableViewCell 
    cell.subTitle.text = name[indexPath.row] 
    return cell 
} 
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if selectedCellIndexPath == indexPath { 
     return selectedCellHeight 
    } 
    return unselectedCellHeight 
} 
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    /* If I select any row in subTableView then the tableview has to disappear and the height of mainTableView row should be rearranged(i.e the dropdown should dissappear) */ 

} 

InnerTableViewCell: 进口的UIKit

class subTableViewCell: UITableViewCell { 

@IBOutlet weak var subTitle: UILabel! 
override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
} 

} 

如果我呼吁在mainTableViewCell类mainTableView委托方法,然后它会很容易但我正在为此而斗争我!

+0

使用postNotification方法或自定义的委托方法, –

+0

我没有看过所有的代码,但如果你想回调到MainTableView,那么在顶层'cellForRowAtIndexPath'期间给MainTableViewCell一个属性设置为'self'(即主控制器)怎么样? –

回答

0

首先创建一个委托方法细胞: -

import UIKit 

protocol MainTableViewCellDelegate { 
    func myFunc() 
} 

class MainTableViewCell:UITableViewCell,UITableViewDataSource,UITableViewDelegate { 

    var MainTableViewCellDelegate! = nil 

    // Put Your Other code Lines 


    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     delegate.myFunc() 
    } 
} 

然后在你的MainTableView添加MainTableViewCellDelegate: -

import UIKit 

class MainTableView: UIViewController,UITableViewDelegate,UITableViewDataSource, MainTableViewCellDelegate { 

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
      let cell = dropDownList.dequeueReusableCellWithIdentifier("cell2", forIndexPath: indexPath) as! subTableViewCell 
      cell.subTitle.text = name[indexPath.row] 
      cell.delegate = self 
      return cell 
     } 

     func myFunc() { 
      self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil) //Put your segue 
     } 
} 
+0

你会告诉如何使用另一个表视图的单元格内的tableview来执行下拉菜单吗? – GuganReddy

+0

为此,您应该使用第三方库或某些教程。 –

相关问题