2016-06-10 2 views
0

Я использую UITableViewController как popover в моем MainViewController. То, что я хочу достичь, - это обнаружить щелчки таблицы и выполнить некоторые действия в моем MainViewController. Как мне это достичь?Как определить события щелчка в popover? (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

Я думаю, вы можете сохранить ссылку на основной ViewController в вашем MoreTableViewController.

В вашем MoreTableViewController добавить переменную

var underlyingMainViewController: MainViewController? 

сохранить ссылку при представлении MoreTableViewController:

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

затем добавить некоторые государственные функции к вашему MainViewController, что вы хотите позвонить:

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

и назовите их в своем MoreTableViewControl Лер:

underlyingMainViewController?.printFromMainViewController() 
+1

Вы никогда не должны держать ссылку storng другого ViewController в своем ViewCOntroller.То почему вы там delagets. –

+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") 
    } 
Смежные вопросы