使用 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 的回答。帮我解决了问题
我是 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 的回答。帮我解决了问题