使用NSNotification从UITableView行选择传递给uiViewController

时间:2016-05-18 11:24:19

标签: ios objective-c uitableview nsnotification

我是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];

7 个答案:

答案 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的表单并创建并在一次通话中发布通知。)