使用 NSNotification 将消息从 UITableView 行选择传递到 uiViewController

Pass Message using NSNotification from UITableView row selection to uiViewController

我是 IOS 的新人。我寻找解决方案超过一天,但所有可用的解决方案都在单个 UIViewConntroller 中工作,但是当我在 uiTableView 行选择和 UIViewConntroller 之间作为观察者执行此操作时,观察者不会调用选择器。

在 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];

**uiviewcontroller 中的 SelectorAction**

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

    NSLog(@"Notification  Received ");
}

您不必创建 NSNotification 对象。仅 post 选择行时的通知 :

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

尝试一下,希望对您有所帮助:

#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

使用 tableView didSelectRowAtIndexPath 委托:

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

在 UITableViewController 中,当您 select 行 Post 通知:

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 的实例?否则你将得不到回复。

Stefos 的回答是 post 通知的常用方式,但如果您确实想手动创建通知对象,则需要 post 它:

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

(我认为我 曾经 像这样分两步完成。我总是使用其中一种形式,其中包含名称、选项和 userInfo 以及在一次通话中创建并 posts 通知。)

嗨@Abdul Rehman Warraich,我遇到了你的问题。您在一个视图中发布通知,并试图在另一个视图中观察它。但是发生的事情是,在第二个视图中,您的观察者尚未准备好(未加载)以获取您发送的通知。

一旦您进入第二个视图,那个时间本身的观察者就是 loaded.so 它显然会错过通知。

所以无论何时你进行 push 和 pop,observer 都会作为新的加载。所以每次它都会观察不到它。

提示:尝试在您的第二个视图中加载观察器,然后再触发通知。 希望对大家调试有所帮助

上面的任何代码都没有问题,我用错误的方式感染了它。我先发出通知,然后在 post 发出通知后观察。 但我必须先观察,然后 post 通知。

我解决这个问题是:

在 AppDelegate didFinishLaunchingWithOptions 中:首先加载 viewControler,以便观察者准备好接收通知(inViewDidLoad),然后 Show/navigate 到 tableView 然后它工作 perfect.This 不是'这不是正确的方法,但对我有用。 :)

另请阅读@karthik 和@Priyanka Mistry 的回答。帮我解决了问题