2015-04-22 4 views
4

У меня есть проект с объектами-c-классами и быстрыми классами. Сейчас я нахожусь в точке, где я должен отправить уведомление от Objective-C класса:NSNotificiation между классом object-c и классом swift

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    // Here I present swift view controller 
    CollectionViewController *cvc = [[CollectionViewController alloc] initWithNibName:@"CollectionViewController" bundle:nil]; 
    UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:cvc]; 
    [self.navigationController presentViewController:controller animated:YES completion:nil]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"BuildingReady" object:self userInfo:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:chosenBuilding, nil] forKeys:[NSArray arrayWithObjects:@"chosenBuilding", nil]]]; 
} 

И я слушаю это уведомление в быстром классе:

import UIKit 

@objc class CollectionViewController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegate , UICollectionViewDelegateFlowLayout { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "getBuilding:", name: "BuildingReady", object: nil) 
    } 

    func getBuilding(notification: NSNotification) { 
     let userInfo: Dictionary<String, Building!> = notification.userInfo as! Dictionary<String, Building!> 

     self.chosenBuilding = userInfo["chosenBuilding"] 
    } 

Проблема не в том, что в быстром классе я никогда поймать мое уведомление (func getBuilding никогда не вызывается). Может ли быть проблема, что один объект является объектным классом c, а второй - классом swift?

+0

Можете ли вы пытались изменить getBuilding к Func getBuilding общественности? –

+0

@MustafaIbrahim Я не думаю, что это проблема. Потому что в разных классах я отправляю уведомление об этом ('CollectionViewController') swift-классе, и он улавливает уведомление, затем вызывается другая func (написанная так же, как 'getBuilding'), и нет проблем. – Superian007

+0

Возможно, вам не следует использовать две строковые константы. Вы пытались объявить одну, общедоступную строковую константу? –

ответ

1

попробовать что-то вроде этого:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"BuildingReady" object:self userInfo:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:choosedBuilding, nil] forKeys:[NSArray arrayWithObjects:@"choosedBuilding", nil]]]; 
}); 
+0

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

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