1

我想我理解委托背后的逻辑。我有更多使用它的问题。涉及多少步骤?我必须使用现有的代表吗?或者我可以使用我的一个吗?

在我的示例中,我得到了创建许多相同类型的视图(对象/视图控制器)的 AppDelegate。每个视图都应该以某种方式调用 AppDelegate 上的方法来关闭自己。当触摸视图中的按钮时会发生这种情况。方法调用将包括视图(自身)的引用。

到目前为止,我从其他语言的响应者、事件侦听器等处了解到。它们使用起来非常简单。

有谁能够帮我。我刚刚在网上找到了包含大量代码的大量示例。在 Objective C 中调用父级并不难。

4

3 回答 3

1

您可以创建自己的:

在 MyView1.h 中:

@class MyView1;

@protocol MyView1Delegate <NSObject>

- (void)closeMyView1:(MyView1 *)myView1;

@end

@interface MyView1 : NSObject
{
    id<MyView1Delegate> _delegate;
}

@property (assign, nonatomic, readwrite) id<MyView1Delegate> delegate;

...

@end

在 MyView1.m 中:

@interface MyView1

@synthesize delegate = _delegate;

...

// The method that tells the delegate to close me
- (void)closeMe
{
    ....
    if ([_delegate respondsToSelector:@selector(closeMyView1:)])
    {
        [_delegate closeMyView1:self];
    }
}

@end

在 AppDelegate.h 中:

#import "MyView1.h"

@interface AppDelegate <MyView1Delegate>
{
    MyView1 *_myView1;
}

...

@end

在 AppDelegate.m 中:

- (void)someCreateViewMethod
{
    _myView1 = [[MyView1 alloc] initWithFrame:NSMakeRect(0, 0, 100, 200)];
    [_myView1 setDelegate:self];
    ...
}
于 2012-06-27T15:36:27.603 回答
1

获得所需内容的一种简单方法是从一个视图开始。然后,以模态方式呈现彼此的视图。当按下视图中的按钮时

[self dismissModalViewControllerAnimated:YES];

这是我不久前开始 iPhone 开发时所做的一些事情,它可能会帮助你处理代表

Delegates

//In parent .m file:
//assign the delegate
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"segueName"])
    {
        childController *foo = segue.destinationViewController;
        foo.delegate = self;
    }

}

//implement protocol method(s):
- (void) methodName:(dataType*) dataName
{
    //An example of what you could do if your data was an NSDate
    buttonLabel.titleLabel.text = [[date description] substringToIndex:10];
}

//In parent .h file:
//import child header
#import "ChildName.h"

//indicate conformity with protocol
@interface ParentName : UIViewController <ChildNameDelegate>

//In child .h file
//declare protocol
@protocol ChildNameDelegate
- (void) methodName:(dataType*) dataName;
@end

//declare delegate
@property (unsafe_unretained, nonatomic) id<ChildNameDelegate> delegate;


//In child .m file
//synthesize delegate
@synthesize delegate; 

//use method
- (IBAction)actionName:(id)sender 
{
    [delegate methodName:assignedData];
}
于 2012-06-27T15:36:02.270 回答
1

我认为你应该为此使用NSNotificationCenter

在你AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
...
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buttonPushed:) name:@"ButtonPushedNotification" object:nil];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
...
...
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

这是通知发生时将调用的选择器(我们仍在AppDelegate.m中)

- (void)buttonPushed:(NSNotification *)notification {
NSLog(@"the button pushed...");
}

并且在按下按钮时(在方法内部)的ViewController.m中,您应该发布这样的通知:

{
...
[[NSNotificationCenter defaultCenter] postNotificationName:@"ButtonPushedNotification" object:nil];
...
}
于 2012-06-27T16:32:23.597 回答