ios在自定义视图和视图控制器之间传递数据

时间:2012-11-05 18:07:27

标签: iphone objective-c ios ipad

我是iOS开发的初学者。我有一个自定义视图:

@interface MyView : UIView {

在ViewController中,我将此视图添加为子视图(以其他方式更好,可能在故事板中?):

MyView *myView = [[MyView alloc]initWithFrame:myFrame];
[self.view addSubview:myView];

在其中,我按照屏幕上的触摸,我有一个touchesEnded方法:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    // myValue is a class variable of MyView
    myValue = doSomething();
}

现在,如何在ViewController中获取myValue的值?也许是可以在MyView中的touchesEnded内调用的监听器或回调?

2 个答案:

答案 0 :(得分:0)

嗯,一个简单的方法是在MyView中保持对视图控制器的引用,例如,定义一个属性,如:

@property (weak,nonatomic) MyViewController *viewController;

然后在视图控制器中分配myView.viewController = self。这样,您就可以从MyView调用视图控制器上的任何方法,例如[viewController myView:self changedValue:myValue]或其他任何方法。

(并且,是的,可以直接在故事板中添加自定义视图子类。只需在故事板中添加通用UIView并将其类更改为MyView。)

当然有许多替代方法,例如通知,或者只是在视图控制器中轮询MyView的属性,如果它在某些时候只是感兴趣,等等。

答案 1 :(得分:0)

例如,您可以在视图的 touchesEnded 方法中发布 NSNotification

[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDidTouch" object:self];

在视图控制器中监听此通知。要实现这一点,请在视图控制器的方法 viewDidLoad 中添加一行:

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

然后在视图控制器中实现以下方法:

- (void) onViewDidTouch:(NSNotification*)notification
{
    // do something
}