我是IOS的新人。我寻找解决方案超过一天,但所有可用的解决方案都在单个UIViewConntroller中工作,但当我在uiTableView行选择和UIViewConntroller之间做Observer时,Observer不会调用Selector。
在uitableviewcontroller中的行选择
Complete Current Statement
**在viewdidload **上的UIViewController中
NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"];
NSNotification * notification =[[ NSNotification alloc] initWithName:@"NOTIFICATION" object:nil userInfo:dict];
** uiviewcontroller中的SelectorAction **
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receivedNotification:)
name:@"NOTIFICATION" object:nil];
答案 0 :(得分:2)
上述任何代码都没有问题,我会以错误的方式进行操作。我先发出通知,然后在发布通知后观察。 但我必须先观察并发布后的通知。
我将此问题解决为:
在AppDelegate中didFinishLaunchingWithOptions:首先加载viewControler,以便观察者准备好获取通知(inViewDidLoad),然后显示/导航到tableView然后它工作正常。这不是正确的方法,但工作为了我。 :)强>
同时阅读@karthik和@Priyanka Mistry答案。帮助我解决了这个问题。
答案 1 :(得分:1)
您不必创建NSNotification对象。只需在选择行时发布通知:
NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION" object:nil userInfo:dict];
答案 2 :(得分:1)
在UITableViewController中选择Post Notification行时
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中的Write方法:
-(void)receivedNotification:(NSNotification*) notification
{
NSLog(@"Notification Received ");
}
检查UIViewController的实例是否在堆栈中?否则你不会得到答复。
答案 3 :(得分:1)
嗨@Abdul Rehman Warraich,我遇到了你的问题。您在一个视图中发布通知,并尝试观察另一个视图。但是,在第二个视图中,您的观察者未准备好(未加载)以获取您发送的通知。
一旦你进入第二个视图,那个时间本身的观察者就会被加载。所以它显然会错过通知。
所以每当你进行推送和弹出时,观察者都会加载为新的。所以每次都不能观察它。
提示:在发出通知之前,尝试在第二个视图中加载观察者。 希望它能帮助你调试。
答案 4 :(得分: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
答案 5 :(得分:0)
使用tableView didSelectRowAtIndexPath Delegate:
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath
{
//Post notification here
}
答案 6 :(得分:0)
Stefos&#39;回答是发布通知的常用方法,但如果您确实想手动创建通知对象,则需要发布通知:
NSDictionary * dict =[NSDictionary dictionaryWithObject:@"Ravi" forKey:@"name"];
NSNotification * notification =[[ NSNotification alloc]
initWithName:@"NOTIFICATION"
object:nil userInfo:dict];
[[NSNotificationCenter defaultCenter] postNotification: notification];
(我不认为我曾经通过以下两个步骤完成它。我总是使用其中一个带有名称,选项和userInfo的表单并创建并在一次通话中发布通知。)