代理中的Obj-C委派 [英] Obj-C Delegate inside Delegate
问题描述
然而,我在我上面介绍了一个modalViewController, viewController。
(在我的modalViewController中,我已经实现了相同的标题,并且它从标题中获取了代理),但是如果按下了标题的后退按钮,那么它自己的这个视图必须委托给以前的viewController。 >
我已经做了相同的功能,但我的viewController从来没有得到它的委托... :(
我是相当新的Obj-C,我不知道也许我在这里做一些非法的事情。
这里是modalViewController尝试委托给以前的viewController的代码
#pragma mark - header delegate
- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
if(header ==标记)
{
NSLog(@gotBackButtonDelegate);
//删除项数组
// _ itemSourceArray = nil;
[委托allEventsDrillPage:self backbuttonPressed: sender];
[self dismissViewControllerAnimated:YES completion:nil];
}
}
这个委托从标题视图中触发。
我以前的viewController:
- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender // doesn' t工作:(
{
NSLog(@取回代理!!!!!!!!!!!!!!!!!!!!!!!!!!!!! );
// [self dismissViewControllerAnimated:YES completion:nil];
_drillPage = nil;
}
从未得到调用
我像这样调用modalViewController:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath :( NSIndexPath *) indexPath
{
[_allEventsTableView deselectRowAtIndexPath:indexPath animated:YES];
[self> _allEventsTableView setNeedsDisplay];
[self> _allEventsTableView reloadData];
_drillPage = [[allEventsDrillPage alloc] initWithDictionary:((NSDictionary *)[_tableDataSource objectAtIndex:indexPath.row])];
_drillPage.delegate = self;
[self presentViewController:_drillPage animated:YES completion:nil];
}
在.h文件中我做了
@interface allEvents:UIViewController< headerDelegate,UITableViewDataSource,UITableViewDelegate,allEventsDrillPageDelegate>
我没有得到我在这里缺少的东西: - /可以some1看看吗?
如果需要更多信息我将添加只是要求它。
编辑:
modalViewController内的委托协议
@class allEventsDrillPage;
@protocol allEventsDrillPageDelegate // define delegate protocol
- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender;
@end
@interface allEventsDrillPage:UIViewController
{
id< allEventsDrillPageDelegate> __weak代表
....
}
@property(weak,nonatomic)id< allEventsDrillPageDelegate>代表; //定义
nmh的答案是正确的。我早些时候写了一个答案,但他来得更快,所以我以为我会拿出其他部分,只是在这里添加说明。
你有这个: p>
@interface allEventsDrillPage:UIViewController
{
id< allEventsDrillPageDelegate> __weak代表
....
}
@property(weak,nonatomic)id< allEventsDrillPageDelegate>代表;
使用这个 id< allEventsDrillPageDelegate> __weak delegate;
你声明一个ivar。
使用这个 @property(weak,nonatomic)id< allEventsDrillPageDelegate>委托;
您正在声明一个属性。
由于Xcode 4.4可以自动合成。
所以这一行:
_drillPage.delegate = self;
您正通过该属性设置一个。
而不是这样:
id< allEventsDrillPageDelegate> __weak代表
所以你在这里:
[delegate allEventsDrillPage:self backbuttonPressed:sender];
您正在使用上述ivar,而不是通过该属性。
和委托
因此 nil。
因此,如果您尝试使用nmh的解决方案向代理发送消息,或者:
[self.delegate allEventsDrillPage:self backbuttonPressed:sender];
它应该按预期工作。
关闭模式视图控制器的附录:
而不是将其从当前的视图控制器中解除,而将其从一个谁提出它,所以:
- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
if(header == logo)
{
NSLog(@gotBackButtonDelegate);
[_delegate allEventsDrillPage:self backbuttonPressed:sender];
//或self.delegate
}
}
in:
- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender
{
NSLog(@取回代理!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! );
[self dismissViewControllerAnimated:YES completion:nil];
_drillPage = nil;
}
甚至更好:
($)$($)$($)$($)$($)$($)$($)$ {code $ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!);
[self dismissViewControllerAnimated:YES完成:^ {
_drillPage = nil;
}];
}
希望这有帮助。
I have subclassed a view that I am using as header view it has some buttons delegate inside it and it works perfect .
However I am presenting a modalViewController above my viewController . (in my modalViewController I have implemented the same header , and it does get the delegates from the header) but this view it self has to delegate to the previous viewController if the back button of the header is pressed.
I have made the same functions but my viewController never gets it's delegate... :( I am quite new to Obj-C and I don't know maybe I am doing something illegal here.
here is the code of modalViewController trying to delegate to the previous viewController
#pragma mark - header delegate
- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
if(header == logo)
{
NSLog(@"gotBackButtonDelegate");
//delete the items array
//_itemSourceArray = nil;
[delegate allEventsDrillPage:self backbuttonPressed:sender];
[self dismissViewControllerAnimated:YES completion:nil];
}
}
This delegate does triggers from the header view.
however in my previous viewController:
- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender //doesn't work :(
{
NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
// [self dismissViewControllerAnimated:YES completion:nil];
_drillPage = nil;
}
never get called
I calling the modalViewController like this:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[_allEventsTableView deselectRowAtIndexPath:indexPath animated:YES];
[self->_allEventsTableView setNeedsDisplay];
[self->_allEventsTableView reloadData];
_drillPage = [[allEventsDrillPage alloc]initWithDictionary:((NSDictionary*) [_tableDataSource objectAtIndex:indexPath.row])];
_drillPage.delegate = self;
[self presentViewController:_drillPage animated:YES completion:nil];
}
in its .h file I did
@interface allEvents : UIViewController <headerDelegate , UITableViewDataSource , UITableViewDelegate ,allEventsDrillPageDelegate>
I don't get what am I missing here :-/ can some1 take a look please ? if needed more info I will added just ask for it.
EDIT:
protocol of delegate inside the modalViewController
@class allEventsDrillPage;
@protocol allEventsDrillPageDelegate //define delegate protocol
- (void)allEventsDrillPage:(allEventsDrillPage*)allEventsDrillPage backbuttonPressed:(UIButton*)sender;
@end
@interface allEventsDrillPage : UIViewController
{
id<allEventsDrillPageDelegate> __weak delegate;
....
}
@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate; //define
nmh's answer is correct. I wrote up an answer earlier but his came in faster, so I thought I would take out the other parts and just add the explanations here.
You have this:
@interface allEventsDrillPage : UIViewController
{
id<allEventsDrillPageDelegate> __weak delegate;
....
}
@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate;
With this id<allEventsDrillPageDelegate> __weak delegate;
you declare an ivar.
With this @property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate;
you are declaring a property.
Since Xcode 4.4 you get auto-synthesization. And so this line:
_drillPage.delegate = self;
You are setting the one via the property.
And not this:
id<allEventsDrillPageDelegate> __weak delegate;
So what you have here:
[delegate allEventsDrillPage:self backbuttonPressed:sender];
You are using the ivar above, not the one via the property.
And delegate
is thus nil.
And so, if you try to send a message to the delegate using nmh's solution or:
[self.delegate allEventsDrillPage:self backbuttonPressed:sender];
It should work as expected.
Addendum to dismissing modal view controller:
Instead of dismissing it from the current view controller, dismiss it from the one who presented it, so:
- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
if(header == logo)
{
NSLog(@"gotBackButtonDelegate");
[_delegate allEventsDrillPage:self backbuttonPressed:sender];
//or self.delegate
}
}
And in:
- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender
{
NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
[self dismissViewControllerAnimated:YES completion:nil];
_drillPage = nil;
}
Or even better:
- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender
{
NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
[self dismissViewControllerAnimated:YES completion:^{
_drillPage = nil;
}];
}
Hope this helps.
这篇关于代理中的Obj-C委派的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!