2016-05-18 3 views
1

Я новичок в IOS. я ищу решение в течение дня, но все доступные решения работают в одном UIViewConntroller, но когда я делал это между выбором строки uiTableView и UIViewConntroller в качестве Observer, тогда Selector не вызывается Observer.Сообщение о переходе с использованием NSNotification из выбора строки UITableView в uiViewController

О выборе строки в UITableViewController

NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"]; 
NSNotification * notification =[[ NSNotification alloc] initWithName:@"NOTIFICATION" object:nil userInfo:dict]; 

** В UIViewController на viewdidload **

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(receivedNotification:) 
              name:@"NOTIFICATION" object:nil]; 

** SelectorAction в UIViewController **

-(void) receivedNotification:(NSNotification*) notification 
{ 

    NSLog(@"Notification Received "); 
} 

ответ

1

привет @Abdul Рехман Warraich, я возникла ваша проблема. вы публикуете уведомление в одном представлении и пытаетесь наблюдать за ним другое представление. но что происходит, во втором представлении ваш наблюдатель не готов (не загружен), чтобы получить уведомление о том, что вы отправили.

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

поэтому всякий раз, когда вы делаете push и pop, наблюдатель загружается как новый. поэтому каждый раз, когда он не замечает этого.

СОВЕТ: Попробуйте загрузить наблюдателя во втором окне, прежде чем вы начнете уведомление. Надеюсь, это поможет вам отладить.

+0

вы правы, я делаю это неправильно. сначала отправляя уведомление, а затем наблюдая за ним. НО нужно сначала наблюдать, а затем отправлять сообщения. –

+0

@AbdulRehmanWarraich, еще один способ, которым вы можете достичь своего решения. получить экземпляр, если представление через раскадровку, например TestVc * test = [self.storyboard instantiateViewControllerWithIdentifer: @ "viewname"], тогда просмотр вызова загрузился, прежде чем вы нажмете [test viewdload]. это всего лишь идея. вы сообщите вам, как только я попробовал – karthik

1

Вы надеваете» t должен создать объект NSNotification. Просто отправьте уведомление, когда выбранный ряд:

NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION" object:nil userInfo:dict]; 
+0

Вам не нужно создавать уведомление, и, кроме того, код, опубликованный OP, не влияет. Это правильный способ отправки уведомления. (Проголосовал) –

+0

сделал это, но все еще не работает :( –

0

Попробуйте это я надеюсь, что это будет полезно:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    myData = [[NSMutableArray alloc]init]; 
    myData = [[NSMutableArray alloc]initWithObjects:@"india",@"Japan",@"pakistan",@"srilanka", nil]; 
    _mytableView.delegate = self; 
    _mytableView.dataSource = self; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:)name:@"NOTIFICATION" object:nil]; 
} 
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return myData.count; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *const identifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    cell.textLabel.text = [myData objectAtIndex:indexPath.row]; 

    return cell; 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION" object:nil userInfo:dict]; 
} 


-(void) receivedNotification:(NSNotification*) notification { 
    NSLog(@"Notification Received "); 
} 

@end 

в viewcontroller.h файл

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> 
{ 

    NSMutableArray *myData; 
} 

@property (weak, nonatomic) IBOutlet UITableView *mytableView; 

@end 
+0

все еще селектор не вызывается в uiviewcontroller :( –

+0

@AbdulRehmanWarraich я обновил свой ответ, пожалуйста, следуйте коду, я надеюсь, что вы получите результат !! –

+0

@AbdulRehmanWarraich вы используете два разных контроллеры или вы наблюдаете и публикуете в том же контроллере? Я думал, что вы используете два разных контроллера, как вы упомянули tableviewcontroller и uiviewcontroller в своем вопросе. –

0

Использование Tableview didSelectRowAtIndexPath делегатом:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    //Post notification here 
} 
+0

Я использовал его в didSelectRowAtIndexPath. Делегат: но не работал. –

1

В UITableViewController при выборе строки Сообщение Уведомление:

NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION" object:nil userInfo:dict]; 

В UIViewController viewDidLoad метод addObserver:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(receivedNotification:) 
              name:@"NOTIFICATION" object:nil]; 

Запись метода в UIViewController:

-(void)receivedNotification:(NSNotification*) notification 
{ 
    NSLog(@"Notification Received "); 
} 

Проверьте экземпляр UIViewController находится там стек? иначе вы не получите ответ.

+0

. PLZ, можете ли вы уточнить, кто будет проверять iViviewController i nstance в стеке? –

+0

Проверьте, присутствует ли ваш uiviewcontroler или он освобожден. Можете ли вы рассказать об иерархии или о том, как вы называете контроллеры? то есть. Если при щелчке на tableviewcell вы представляете контроллер, и там вы наблюдаете за уведомлением, тогда он не будет работать, поскольку он добавляет oserver после отправки уведомления. –

+0

спасибо за ответ, он действительно полезен и работает для меня. –

0

Stefos' Ответ обычный способ отправить уведомление, но если вы хотите создать объект уведомления вручную, то необходимо разместить его:

NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"]; 
NSNotification * notification =[[ NSNotification alloc] 
    initWithName:@"NOTIFICATION" 
    object:nil userInfo:dict]; 
[[NSNotificationCenter defaultCenter] postNotification: notification]; 

(я не думаю, что я ве когда сделал это в 2 этапа, как это. Я всегда использую одну из форм, которые принимает имя, параметр и USERINFO и создает и сообщения уведомления в одном вызове.)

+0

Он работает отлично, когда я использую его в одном классе, но когда я пытаюсь передать уведомление между двумя классами, он не работает. (не вызывая селектор) –

2

В любом из приведенных выше кодов нет проблем. Я делаю это неправильно. Сначала я отправляю уведомление и наблюдаю за отправкой уведомления. Но я должен наблюдать за первым и после уведомления после него.

Я решить эту проблему:

В AppDelegate didFinishLaunchingWithOptions: груз viewControler первым, так что наблюдатель готов получить уведомление (inViewDidLoad) и после этого шоу/перейти к Tableview А потом работать perfect.This ISN «Правильно, но работай для меня. :)

Также ознакомьтесь с ответами @karthik и @Priyanka Mistry. Помогло решить проблему.

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

  • Нет связанных вопросов^_^