2016-06-10 193 views
0

我在我的MainViewController中使用UITableViewController作为弹窗。我想要实现的是检测tableview点击并在我的MainViewController中执行一些操作。我如何实现这一目标?如何检测弹出窗口中的点击事件? (Swift)

这是我如何创建酥料饼:

let count = sender.dropdownItems?.count 

let storyboard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil) 
var menuViewController: MoreTableViewController = storyboard.instantiateViewControllerWithIdentifier("moreTable") as! MoreTableViewController 
menuViewController.data = sender.dropdownItems! 

menuViewController.modalPresentationStyle = .Popover 
menuViewController.preferredContentSize = CGSizeMake(300, 44*CGFloat(count!)) 

let popoverMenuViewController = menuViewController.popoverPresentationController 
popoverMenuViewController?.permittedArrowDirections = .Any 
popoverMenuViewController?.delegate = self 
popoverMenuViewController?.sourceView = sender 
presentViewController(menuViewController,animated: true,completion: nil) 

这是MoreTableViewController:

import UIKit 

class MoreTableViewController: UITableViewController { 

    //var data: [MoreItem]? 

    var data = [MoreItem]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.scrollEnabled = false 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 



    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return data.count 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("moreCell", forIndexPath: indexPath) as! MoreTableViewCell 

     cell.label.font = UIFont.fontAwesomeOfSize(17) 
     cell.label.textColor = UIColor.init(hexString: MyConstants.COLOR_GREY) 
     cell.label.text = data[indexPath.row].label 


     return cell 
    } 


    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("Do something in MainViewController") 
    } 



} 
+0

您的意思是将数据传递回以前的视图控制器? – jo3birdtalk

回答

1

库克,

你可以利用代表。

在你MoreTableViewController添加协议作为

protocol LetsInformPreviousViewControllerProtocol : class { 
    func cellTapped(WithIndex index : NSIndexPath) //pass whatever the data u want to pass to previous View controller here am passing indexPath of selected cell 
} 

,并创建一个弱引用变量来保存委托类的参考。

weak var delegate : LetsInformPreviousViewControllerProtocol? 
在didSelectRowAtIndexPath方法

最后

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     self.delegate?.cellTapped(WithIndex: indexPath) 
    } 

而在你MainViewController确认协议LetsInformPreviousViewControllerProtocol使用

class MainViewController: UIViewController, LetsInformPreviousViewControllerProtocol 

,当你提出MoreTableViewController

let storyboard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil) 
var menuViewController: MoreTableViewController = storyboard.instantiateViewControllerWithIdentifier("moreTable") as! MoreTableViewController 
menuViewController.delegate = self 

最后一步的实现方法cellTapped作为

func cellTapped(WithIndex index: NSIndexPath) { 
     print("\(index)") 
    } 

这将让你的代码崩溃自由和强大。

避免强引用ViewControllers,这可能会导致内存泄漏。

1

我想你可以保存在你的MoreTableViewController的参考基本视图控制器。

在你MoreTableViewController添加变量

var underlyingMainViewController: MainViewController? 

呈现MoreTableViewController时节省参考:

presentViewController(menuViewController,animated: true){ _ in 
    menuViewController.underlyingMainViewController = self 
} 

然后添加你要调用一些公共功能,以您的MainViewController:

func printFromMainViewController() { 
    print("Hello from the MainViewController!") 
} 

并在您的MoreTableViewControl中调用它们LER:

underlyingMainViewController?.printFromMainViewController() 
+1

你不应该在ViewCOntroller中持有另一个ViewController的storng引用。这就是为什么你有拖拉。 –

+0

好点。 OP,使用这个家伙的回答! – hmSchuller

+0

谢谢你哥们:) –

0

你可以这样做太

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     let mainViewController : MainViewController = self.presentingViewController as! MainViewController 
     print("Do anything with mainViewControllerr") 
    }