2015-09-06 2 views
1

Я внедрил side menu from github в свой проект. Я пытаюсь добавить в него . Таким образом, когда выбирается cell, вызов будет вызван в другом классе (основной viewController). Вот мой код:Делегат протокола не вызывает функцию

tableView.swift

protocol menuTableViewProtocol { 
    func didSelectCell(SelectedCellNumber : Int) 
} 

var delegate : menuTableViewProtocol? 

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

mainVC.swift 

class MainViewController: UIViewController, menuTableViewProtocol { 

    ... 

    // Conforming to Protocal 
    func didSelectCell(SelectedCellNumber: Int) 
    { 
     switch SelectedCellNumber { 
     case 0: 
      println("0") 

     case 1: 
      println("1") 

     case 2: 
      println("2") 

     default: 
      println("0101010") 
     } 
    } 
} 

Когда я запустить приложение и выбрать ячейку, ничего не происходит. didSelectRowAtIndexpath действительно называется. (Я вставил println, и он печатает), но didSelectCell (protocol function) не вызывается. Что я делаю неправильно, и что я могу сделать, чтобы исправить это?

+0

В вашем mainVC вы соответствовали этому протоколу и установить экземпляр Tableview делегата, как я? Можете ли вы показать этот код. –

+0

Я отредактировал вопрос в соответствии с протоколом. Я думал, что чего-то не хватает. У меня нет экземпляра tableView.swift ** в mainVC.swif **, поэтому он не может сделать делегата самостоятельно. Созданный 'tableView' get создается в navigationController.swift. https://github.com/evnaz/ENwiftSideMenu/blob/master/Example/SwiftSideMenu/MyNavigationController.swift И я вызываю метод только в mainVC.swift. ('toggleSideMenuView') – Jessica

+0

извините, но у меня нет большой идеи о стороннем компоненте, который вы используете, но в идеале у вас должен быть экземпляр и задать делегат для себя, чтобы действительно делегировать делегаты. Или вы также можете посмотреть уведомления, если это вам подходит. –

ответ

0

Как вы упомянули в своих комментариях, что вы не можете установить делегат самостоятельно, и нет прямых отношений между вашими классами, поэтому вы должны использовать NSNotificationCenter вместо протокола и делегата.

// Класс A (mainVC.swift)

//Add Observer in init method 
NSNotificationCenter.defaultCenter().addObserver(self, selector: "handler:", name: "MyNotification", object: nil) 

//Handler 
func handler(notif: NSNotification) { 
    println("MyNotification was handled"); 
    println("userInfo: \(notif.userInfo)"); 
    println("SelectedCellNumber \(notif.userInfo!["selectedCellNumber"])"); //Validate userInfo here. it could be nil 

} 

// Класс B (tableView.swift)

// Call from any method 
NSNotificationCenter.defaultCenter().postNotificationName("MyNotification", object: nil, userInfo: ["selectedCellNumber" : indexPath.row]); 

для более подробно, вы можете следовать некоторые учебники;

http://derpturkey.com/nsnotificationcenter-with-swift/

+0

Спасибо за ответ! Как передать 'indexPath.row' в' mainVC.swift'? – Jessica

+0

@Jessica см. Мое обновленное сообщение – Shoaib

Смежные вопросы