委托引用在模态弹出窗口中消失

时间:2013-10-30 18:00:08

标签: ios iphone objective-c delegates xib

这是令人费解的,所以我会尽力提供尽可能多的信息。我的主要UIViewController以信息屏幕的形式打开一个模态弹出窗口。

这是来自MainViewController的调用

infoPopup = [ModalPopup modalPopupWithDelegate:self];

[infoPopup presentInView:self.view.window];

[self.view addSubview:infoPopup];

这是ModalPopup中的接收方法

+ (id)modalPopupWithDelegate:(id <ModalPopupDelegate>)dlg {

ModalPopup *info = [[ModalPopup alloc] init];
info.delegate = dlg;

return info;
}

在ModalPopup中,我使用“modalPopupFinished”的可选方法创建一个协议,并使MainViewController成为委托。

在ModalPopup中我添加了一个UIScrollView并在滚动视图中插入了5个UIView。

我在同一个XIB文件中创建了所有视图

NSString *infoXib;

if (IS_IPAD)
    infoXib = @"info_iPad";
else
    infoXib = @"info_iPhone";

NSArray *views;

views = [[NSBundle mainBundle] loadNibNamed:infoXib owner:self options:nil];
UIView *v1 = [views objectAtIndex:0];

views = [[NSBundle mainBundle] loadNibNamed:infoXib owner:self options:nil];
UIView *v2 = [views objectAtIndex:1];

views = [[NSBundle mainBundle] loadNibNamed:infoXib owner:self options:nil];
UIView *v3 = [views objectAtIndex:2];

views = [[NSBundle mainBundle] loadNibNamed:infoXib owner:self options:nil];
UIView *v4 = [views objectAtIndex:3];

views = [[NSBundle mainBundle] loadNibNamed:infoXib owner:self options:nil];
UIView *v5 = [views objectAtIndex:4];

NSArray *pages = [NSArray arrayWithObjects:v1, v2, v3, v4, v5, nil];
[self setPagesInArray:pages];


- (void)setPagesInArray:(NSArray *)pages {

    if (pages) {

        int numberOfPages = pages.count;

        [pageScroll setContentSize:CGSizeMake(pageScroll.frame.size.width * numberOfPages, pageHeight)];
        pageControl.numberOfPages = numberOfPages;

        NSUInteger i = 0;

        while (i < numberOfPages) {

            UIView *page = [pages objectAtIndex:i];
            page.frame = CGRectMake(pageWidth * i, 0, pageWidth, pageHeight);
            [pageScroll addSubview:page];

            i++;
        }
    }
}

视图在滚动视图中加载正常,我可以按预期滚动它们。

XIB中的一个视图作为一些按钮,我使视图成为Custom Class ModalPopup的成员。我已经将按钮连接到ModalPopup中的一些IBActions,它们按预期启动。

在ModalPopup中,我创建了一个关闭按钮,用于在MainViewController上触发委托“modalPopupFinished”事件。

- (void)finishCloseAnimation {

    if ([_delegate respondsToSelector:@selector(modalPopupFinished)])
        [_delegate modalPopupFinished];

    [self removeFromSuperview];
}

没有问题一切都很好......除了

当我按下View中的一个按钮并转到一个委托方法时,它已经失去了大脑而无法记住代表

- (IBAction)facebook:(id)sender {

    if ([_delegate respondsToSelector:@selector(sendLikeFacebook)])
        [_delegate sendLikeFacebook];
}

事实上,当我在ModalPopup上进入Facebook方法时,一切都是零。

我想在MainViewController中触发的方法打开

[self presentViewController:composeController animated:YES completion:nil];

因此我想从主页面打开它。

1 个答案:

答案 0 :(得分:0)

听起来像你有2个ModalPopup实例。既然你说你把你的按钮连接到IB中的ModalPopup,这让我相信你在xib中创建了一个ModalPopup实例,它不同于你以编程方式创建的ModalPopup。按下按钮时调用的ModalPopup“完全为空”的事实是进一步的证据。

如果是这种情况,那么您应该从xib获取实例,而不是以编程方式创建ModalPopup,就像获取视图一样。我还怀疑您已经将视图添加到xib中的ModalPopup,这意味着您不必手动添加它们。