obj-c:无法使用Notification更改viewcontroller的subView

时间:2013-02-03 16:14:22

标签: objective-c

我对以下情况感到困惑。 我有一个viewcontroller(VC),它有1个子视图(SubV)和1个其他类。(classA) 此外,我有一个从classA调用的事件处理程序,我希望此事件处理程序在VC中更改我的subV。

当我直接从VC访问SubV时,可以,子视图的图像改变等。 但是当classA触发VC的事件处理程序时,它会到达VC,也可以访问subView的方法,但是我的子视图没有变化! (我也尝试代理,但结果是一样的)

ViewController.h

@interface ViewController : UIViewController {
.
IBOutlet SubView *subView;
ClassA *classA;
.
}
@property (retain, nonatomic) IBOutlet SubView *subView;
@property (retain, nonatomic) ClassA *classA;

ViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.subView = [self.subView init];
self.classA = [[ClassA alloc] init];

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

}

- (void) eventListener:(NSNotification *) not
{
   [self.subView RefreshView]; // it doesnt work! calls refreshView method but no change
}

- (IBAction)buttonPressed:(id)sender
{ 
   [self.subView RefreshView]; // it works perfect
}

SubView.h

@interface SubView : UIImageView 

@property int state;
@property NSArray *imageArray;

- (void) RefreshView;
- (id) init;

@end

SubView.m

- (void) RefreshView{
[self stopAnimating];
self.imageArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"a.png"], nil];
self.animationDuration = 1;   
self.animationImages = self.imageArray;
self.animationRepeatCount = 0;
[self startAnimating];
}

ClassA.m

-(void)methodA{
  [myEvent requestEvent];
}

所以,我在这里要做的是访问&使用Viewcontroller中的按钮更改subView,并在另一个classA中运行一个线程

2 个答案:

答案 0 :(得分:0)

编辑:不太确定该怎么做。你已经根据我提出的修改编辑了你的帖子,让我的答案看起来多余,最糟糕的是......

您已将类SubView创建为UIImageView的子类。但是IBOutlet * subView不是SubView类的成员,而是UIImageView的成员。我怀疑这可能会延续到xib / storyboard(?)如果是这样,这意味着你发送给你的subView实例的任何消息都将由一个股票UIImageView而不是你自己的类来处理......

@property (retain, nonatomic) IBOutlet UIImageView *subView;

应该阅读

@property (retain, nonatomic) IBOutlet SubView *subView;

答案 1 :(得分:0)

最后我找到了解决方案!由于我在ClassA中运行的线程,我应该使用'

[self performSelectorOnMainThread:@selector(myMethodToRefreshSubView) withObject:nil    waitUntilDone:NO];

在我的eventListener方法中。